为什么这个 PowerShell 别名不起作用?

为什么这个 PowerShell 别名不起作用?

我正在学习 PowerShell。

我想了解为什么 Windows 8.1 下的 PowerShell 5.0 中的某些别名不起作用。

例如,这个命令单独起作用:

Get-WmiObject -Class Win32_WinSAT

$profile但当我按如下方式定义时却不行:

Set-Alias -Name wei -Value 'Get-WmiObject -Class Win32_WinSAT'

错误信息如下:

PS C:\> wei
wei : The term 'Get-WmiObject -Class Win32_WinSAT' is not recognized as the 
name of a cmdlet, function, script file,
or operable program. Check the spelling of the name, or if a path was 
included, verify that the path is correct and
try again.
At line:1 char:1
+ wei
+ ~~~
    + CategoryInfo          : ObjectNotFound: (Get-WmiObject -Class Win32_WinSAT:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

编辑:

我发现别名的工作方式与我习惯的 Linux 上的标准 Bash 略有不同。

解决方案是简单地将其声明为一个函数:

Function wei { Get-WmiObject -Class Win32_WinSAT }

答案1

如果您想将其他参数传递给别名,您可以这样做:

function wei([Parameter(ValueFromRemainingArguments = $true)]$params) {
    & Get-WmiObject -Class Win32_WinSAT $params
}

答案2

通常,PowerShell 会尝试使用第一个空格将命令与参数分隔开。但是,您可以使用字符串来指定空格只是文件的一部分。这实际上可以让您将空格视为非特殊字符,并允许您将诸如“C:\Program Files\Windows NT\Accessories\notepad.exe”之类的内容视为一个单词,而不是两个单词。

这实际上就是您要做的事情。PowerShell 找不到名为“Get-WmiObject -Class Win32_WinSAT”的命令,因为没有这样的命令。(有问题的命令只是“Get-WmiObject”,而不是“Get-WmiObject -Class Win32_WinSAT”。

相关内容