ChatGPT解决这个技术问题 Extra ChatGPT

如何创建永久 PowerShell 别名

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

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

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

笔记:

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

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

m
marc_s

更新 - 2021 年 1 月

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

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

New-Alias Goto Set-Location

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

“$Home\Documents”(通常是 C:\Users\\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 位环境(是的,我知道,文件夹命名是违反直觉的,但它是正确的)。

C:\Windows\System32\WindowsPowerShell\v1.0 用于 64 位环境

C:\Windows\SysWow64\WindowsPowerShell\v1.0 用于 32 位(是的,我知道,文件夹命名是违反直觉的,但它是正确的)。


没有错误,它只是不起作用,我不确定这是否是权限问题。我确实让它工作了(我应该早点评论)。我必须创建文件夹 \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 似乎在其默认位置清除了该文件!
C
Chase Florell

将此类内容直接添加到 $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 : UnauthorizedAccess

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

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 这正是我苦苦挣扎的几个小时。谢谢,我现在完成了。
D
Dave

打开 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 下的文件可能还不存在。不过可以手动创建。
B
Ben Carp

2018 年,Windows 10

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

编写文件快捷方式脚本

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

New-Alias ${shortcutName} ${fullFileLocation}

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

https://i.stack.imgur.com/j6KuB.png

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

编写目录快捷方式脚本

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

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

其余的完全一样。

https://i.stack.imgur.com/wgKE1.png

启用 PowerShell 脚本

https://i.stack.imgur.com/NjZrN.png

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

https://i.stack.imgur.com/0DFPZ.png


echo $profile 是一个很棒的提示,可帮助您找到添加文件的正确位置。感谢您的全面回答
g
golden_grahams

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

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

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

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


L
Leon Bambrick

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

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

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

是 $PROFILE.CurrentUserAllHosts

请注意,如果您之前没有这样做过,您将看到由于您的执行策略,您将无法运行脚本,您需要将其从 Restricted(默认)更改为 Unrestricted。

为此,请关闭脚本,然后键入以下命令:

设置 ExecutionPolicy -Scope CurrentUser

然后:

远程签名

然后再次执行此命令:

是 $PROFILE.CurrentUserAllHosts

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


您可能想要:Set-ExecutionPolicy RemoteSigned。不要去推荐Unrestricted。来源:itprotoday.com/management-mobility/…
S
Shivanshu

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

notepad $PROFILE.CurrentUserAllHosts

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

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

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

B
Bimo

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

第 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


P
Paul Williams

这是个人喜好的问题,但我更喜欢将我的别名一起存储在一个单独的文件中,并在配置文件中调用 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)