我正在学习 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”。