如何创建永久 PowerShell 别名

Posted

技术标签:

【中文标题】如何创建永久 PowerShell 别名【英文标题】:How to create permanent PowerShell Aliases 【发布时间】:2014-09-14 21:06:52 【问题描述】:

我想创建一个cmdletalias 在我关闭当前Powershell 会话后不会过期,假设我有这个别名:

C:\Users\Aymen> New-Alias Goto Set-Location

这完美地创建了Goto 别名,但我想在关闭当前会话后使用它,我该如何实现。

注意:

PowerShell 帮助系统建议我可以导出我创建的别名,并在下次打开新会话时导入它们,实际上这并不是我真正想要的,因为有没有直接清晰的方法来保持我通过不同的会话创建它后的别名

【问题讨论】:

IMO 你最好把脚本放到 PATH 中。这样,该命令将立即可用于所有打开的 shell,如果您更改它,更改将传播到所有后续使用,而无需重新加载 $profile 或其他东西。 【参考方案1】:

更新 - 2021 年 1 月

可以在profile.ps1 文件中存储每次 PowerShell 启动时要执行的任何 PowerShell 代码。至少有6 different paths 存储代码的位置取决于哪个用户必须执行它。我们将只考虑其中 2 个:“所有用户”和“仅您的用户”路径(点击上一个链接了解更多选项)。

要回答您的问题,您只需创建一个包含您要执行的代码的profile.ps1 文件,即:

New-Alias Goto Set-Location

并将其保存在正确的路径中:

"$Home\Documents"(通常是C:\Users\<yourname>\Documents):只有你的用户会执行代码。这是推荐的位置 您可以通过在 PowerShell 中运行 echo $profile 来快速找到您的个人资料位置 $PsHome (C:\Windows\System32\WindowsPowerShell\v1.0):每个用户都会执行这段代码

重要提示:记住您需要重新启动 PowerShell 实例才能应用更改。

提示

如果两个路径都包含profile.ps1 文件,则首先执行所有用户的路径,然后执行用户特定的路径。这意味着用户特定的命令将在重复或冲突的情况下覆盖变量。

如果不需要将代码的执行扩展到每个用户,请始终将代码放在用户特定的配置文件中。这更安全,因为您不会污染其他用户的空间(通常,您不想这样做)。 另一个优点是您不需要管理员权限即可将文件添加到您的用户空间(您可以在 C:\Windows\System32 中执行任何操作)。

如果您确实需要为每个用户执行配置文件代码,请注意 $PsHome 路径对于 PowerShell 的 32 位和 64 位实例是不同的。如果您想始终执行配置文件代码,您应该考虑这两种环境。

路径是:

C:\Windows\System32\WindowsPowerShell\v1.0 用于 64 位环境 C:\Windows\SysWow64\WindowsPowerShell\v1.0 用于 32 位(是的,我知道,文件夹命名是违反直觉的,但 it's correct)。

【讨论】:

没有错误,它只是不起作用,我不确定这是否是权限问题。我确实让它工作(我应该早点评论)。我必须创建文件夹 \Users\ME\Documents\WindowsPowerShell 然后添加 Microsoft.PowerShell_profile.ps1 其他路径都不适合我。 根据链接文章使用"$HOME\Documents\WindowsPowerShell" 并命名Microsoft.PowerShell_profile.ps1 将范围限制为非ISE 和当前主机,但不应该是权限问题(与"$Home\Documents\profile.ps1" should apply 相同)。可能不是真的,我试试看,谢谢提供信息 嗨@Naigel,我必须使用这种方法使其工作:superuser.com/questions/516700/… 所以我的最终解决方案是为配置文件创建文件:New-Item -path $profile -type file -force 创建文件夹和文件Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 获取配置文件位置的最佳方法可能是在您的 powershell 窗口中运行“echo $profile”。 记得备份您的 profile.ps1 文件,因为 Windows Creators Update 似乎会清除默认位置的文件!【参考方案2】:

除非你真的希望你的别名是全局的,否则直接将这种东西添加到你的 $env:WINDIR powershell 文件夹中并不是一个好主意。 推荐的方法是将其添加到您的个人资料中:

cd $env:USERPROFILE\Documents
md WindowsPowerShell -ErrorAction SilentlyContinue
cd WindowsPowerShell
New-Item Microsoft.PowerShell_profile.ps1 -ItemType "file" -ErrorAction SilentlyContinue
powershell_ise.exe .\Microsoft.PowerShell_profile.ps1

现在将您的别名添加到现在打开的 Microsoft.PowerShell_profile.ps1 文件中:

function Do-ActualThing 
    # do actual thing


Set-Alias MyAlias Do-ActualThing

然后保存,刷新当前会话:

. $profile

注意: 以防万一,如果您遇到类似的权限问题

CategoryInfo : SecurityError: (:) [], PSSecurityException + FullyQualifiedErrorId : 未授权访问

尝试以下命令并再次刷新会话。

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

【讨论】:

很棒的评论。很清楚,虽然我的powershell没有触摸。 为了允许我的配置文件脚本的执行,我不得不做一个额外的步骤。以管理员身份运行 Powershell,并执行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser-Scope 选项使其更加安全。 这是一个很棒的方法!请注意,该函数本身也可以在 shell 中使用,因此您实际上并不需要 Set-Alias 部分。只需调用函数MyAlias。另外,要传递参数,请使用@Args,例如function gs git status @Args @Automatico 我喜欢明确Set-Alias,因为我喜欢使用适当的 PS 约定和适当的动词来命名我的方法。但是,是的,如果您不挑剔,您可以将您的方法命名为您打算调用的任何名称。 @zombat 这正是我苦苦挣扎的几个小时。谢谢,我已经完成了。【参考方案3】:

2018 年,Windows 10

您可以借助简单的 PowerShell 脚本链接到任何文件或目录。

编写文件快捷方式脚本

打开 Windows PowerShell ISE。在脚本窗格中写入:

New-Alias $shortcutName $fullFileLocation

然后前往命令行窗格。使用 echo $profile 查找您的 PowerShell 用户配置文件地址。将脚本保存在此地址中。

每次打开 powershell 时都会运行 PowerShell 配置文件地址中的脚本。该快捷方式应该适用于每个新的 PowerShell 窗口。

编写目录快捷方式脚本

它需要我们脚本中的另一行。

function $nameOfFunction set-location $directory_location
New-Alias $shortcut $nameOfFunction 

其余部分完全相同。

启用 PowerShell 脚本

默认情况下,PowerShell 脚本被阻止。要启用它们,请打开设置 -> 更新和安全 -> 对于开发人员。选择开发人员模式(可能需要重新启动)。 。

向下滚动到 PowerShell 部分,勾选“更改执行策略...”选项,然后应用。

【讨论】:

echo $profile 是一个很棒的提示,可帮助您找到添加文件的正确位置。感谢您的全面回答【参考方案4】:

打开一个 Windows PowerShell 窗口并输入:

notepad $profile

然后创建一个函数,如:

function goSomewhereThenOpenGoogleThenDeleteSomething 
    cd C:\Users\
    Start-Process -FilePath "http://www.google.com"
    rm fileName.txt

然后在函数名下输入:

Set-Alias google goSomewhereThenOpenGoogleThenDeleteSomething

现在您可以在 Windows PowerShell 中键入单词“google”并让它在您的函数中执行代码!

【讨论】:

$profile 似乎不是 Windows 10 中的默认环境变量。它应该指向什么? @wordsforthewise - $PROFILE 自动变量存储当前会话中可用的 PowerShell 配置文件的路径。它包含在 Windows PowerShell 中。 这是提供的最简单的解决方案。 我必须启用“启用 PowerShell 脚本”(在另一个答案中)才能使其正常工作。真的超级简单! 很好的解决方案,值得注意的是$profile下的文件可能还不存在。不过可以手动创建。【参考方案5】:

只是为了添加到这个可能的位置列表中......

这对我不起作用: \Users\ME\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

但是这样做: \Users\ME\OneDrive\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

如果您没有配置文件或者您想要设置一个配置文件,请运行以下命令,它将创建必要的文件夹/文件,甚至告诉您它的位置! New-Item -path $profile -type file -force

【讨论】:

【参考方案6】:

要创建 profile1.psl 文件,请输入以下命令:

新项目 $PROFILE.CurrentUserAllHosts -ItemType 文件 -Force

要访问该文件,请输入下一个命令:

设置 $PROFILE.CurrentUserAllHosts

注意如果你以前没有这样做过,你会发现你不会 能够运行脚本,因为您的执行策略需要从 Restricted(默认)更改为 Unrestricted。

要关闭脚本,然后键入以下命令:

Set-ExecutionPolicy -Scope CurrentUser

然后:

远程签名

然后再次执行此命令:

设置 $PROFILE.CurrentUserAllHosts

然后最后在脚本中输入你的别名,保存它,它们应该 每次运行 powershell 时运行,即使在重新启动计算机后也是如此。

【讨论】:

您可能想要:Set-ExecutionPolicy RemoteSigned。不要去推荐Unrestricted。来源:itprotoday.com/management-mobility/…【参考方案7】:

这有点花哨......但它有效:

第 1 步:创建 Powershell 配置文件:

FILE: install_profile.ps1
# THIS SCRIPT BLOWS AWAY YOUR DEFAULT POWERSHELL PROFILE SCRIPT
#   AND INSTALLS A POINTER TO A GLOBAL POWERSHELL PROFILE

$ErrorActionPreference = "Stop"

function print ([string]$msg)

    Write-Host -ForegroundColor Green $msg


print ""

# User's Powershell Profile
$psdir  = "$env:USERPROFILE\Documents\WindowsPowerShell"
$psfile = $psdir + "\Microsoft.PowerShell_profile.ps1"

print "Creating Directory: $psdir"
md $psdir -ErrorAction SilentlyContinue | out-null

# this is your auto-generated powershell profile to be installed
$content = @(
    "",
    ". ~/Documents/tools/profile.ps1",
    ""
)

print "Creating File: $psfile"
[System.IO.File]::WriteAllLines($psfile, $content)

print ""

# Make sure Powershell profile is readable
Set-ExecutionPolicy -Scope CurrentUser Unrestricted

第 2 步: 然后在工具中 ~/Documents/tools/profile.ps1:

function Do-ActualThing 
    # do actual thing


Set-Alias MyAlias Do-ActualThing

第 3 步:

$ Set-ExecutionPolicy -Scope CurrentUser Unrestricted $ . ./install_profile.ps1

【讨论】:

【参考方案8】:

我发现我可以运行这个命令:

notepad $PROFILE.CurrentUserAllHosts

它会打开我的默认 powershell 配置文件(针对当前用户,所有主机)。我发现here。

然后添加一个别名。例如,这是jupyter notebook 的别名jn(我讨厌每次都输入繁琐的jupyter notebook):

Set-Alias -Name jn -Value C:\Users\words\Anaconda3\Scripts\jupyter-notebook.exe

【讨论】:

【参考方案9】:

这是个人喜好问题,但我更喜欢将我的别名一起存储在一个单独的文件中,并在配置文件中调用 Import-Alias

$profileDir = Split-Path $PROFILE -Parent
$profileFile = Join-Path $profileDir profile.ps1
$aliasFile = Join-Path $profileDir aliases.csv
New-Alias -Name npp -Value "C:\Program Files\Notepad++\notepad++.exe" -Description "Notepad++"
Export-Alias -Name npp -Path $aliasFile -Append
ise $profileFile

然后在 ISE 中,将此行放入您的 profile.ps1

Import-Alias -Path (Join-Path $PSScriptRoot aliases.csv)

【讨论】:

以上是关于如何创建永久 PowerShell 别名的主要内容,如果未能解决你的问题,请参考以下文章

Powershell别名(Alias)

创建永久可执行别名

为 SQL Server LocalDB 创建永久别名

是否可以创建用户定义的 PowerShell 环境?

Wordpress 自定义别名永久链接

windows azure使用powershell批量创建虚拟机