是否可以使用别名在 PowerShell 内部运行“复杂”的 PowerShell 命令?
举个例子,我想Get-VpnConnection -name "VPNname"
通过一个(非保留)单词命令(例如vpn
通过别名)来替换命令?不幸的是,set-Alias vpn "Get-VpnConnection -name VPNname"
这行不通,也行不通set-Alias vpn Get-VpnConnection -name "VPNname"
(请注意第一个引号的位置不同)。
到目前为止,我的“解决方法”是将命令作为脚本文件保存在 PowerShell 的“启动目录”(在我的情况下为)中,并通过别名C:\Users\username
运行。我使用创建别名。有没有直接的方法可以做到这一点(无需创建脚本文件)?.\vpn.ps1
set-Alias vpn ".\script_vpncheck.ps1"
后续问题:如果这不可能,我想使用脚本文件(例如 via)初始化别名.\script.ps1
(注意:我不需要永久存储它们)。不幸的是,这不起作用。文件似乎已执行,但别名不起作用。知道为什么吗?
答案1
只需将别名存储到轮廓
- 通过运行从 PowerShell 打开配置文件
notepad $PROFILE
(或使用您喜欢的任何编辑器) - 输入您想要运行的命令到该文件并保存(例如
Set-Alias
) - 重新启动 PowerShell 或通过运行获取新更新的配置文件
. $PROFILE
该配置文件与 bash 中的配置文件完全相同.bashrc
,将在启动 shell 时运行。除了别名,您还可以编写功能更复杂的事情。它们将在 PowerShell 启动后可用
function vpn($url) { Get-VpnConnection -name $url }
Set-Alias -Name vpn -Value Get-VpnConnection
您无法为带有参数的命令设置别名,因此在这种情况下您必须创建一个函数
你的 ps1 文件不起作用的原因是它在子壳当子 shell 关闭时,所有内容(包括新别名)都将被清除。您必须来源.
使用点源运算符(类似于.
bash)在当前 shell 中运行脚本
. .\script.ps1
但是,您不必每次需要别名时都去寻找,只需像上面那样在配置文件中永久地进行此操作即可
答案2
别名不是为了接受参数而设计的。来自about_aliases
帮助主题:
带参数的命令的替代名称
您可以为 cmdlet、脚本、函数或可执行文件分配别名。您不能为命令及其参数分配别名。例如,您可以为 Get-Eventlog cmdlet 分配别名,但不能为 Get-Eventlog -LogName System 命令分配别名。
您可以创建一个包含该命令的函数。要创建函数,请键入单词“function”,后跟函数名称。键入命令,并将其括在括号 ({}) 中。
例如,以下命令创建 syslog 函数。该函数代表 Get-Eventlog -LogName System 命令:
function Get-SystemEventlog {Get-Eventlog -LogName System} Set-Alias -Name syslog -Value Get-SystemEventlog
您现在可以输入“syslog”来代替命令。并且,您可以为新功能创建别名。
但您不需要单独的脚本文件。您可以定义一个简单的函数,并使用以下代码将其添加到您的配置文件中:
'Function vpn { Get-VpnConnection -name VPNname }' | Add-Content $PROFILE
该命令vpn
将在所有电源外壳从那时起的会议。