我有一个需要在多个主机(PowerGUI,PowerShell ISE等)下运行的PowerShell脚本,但是我遇到了一个问题,即有时某个主机下不存在cmdlet。有没有办法检查cmdlet是否存在,以便我可以将代码包装在if块中,并在不存在时执行其他操作?
我知道我可以使用$host.name
来划分在每台主机上运行的代码,但我希望使用Feature Detection代替将来添加cmdlet的情况。
我也可以使用try / catch块,但由于它在托管代码中运行,因此我假设有一些代码可以检测是否安装了cmdlet。
答案 0 :(得分:99)
使用Get-Command
cmdlet测试是否存在cmdlet:
if (Get-Command $cmdName -errorAction SilentlyContinue)
{
"$cmdName exists"
}
如果您想确保它是cmdlet(而不是exe或函数或脚本),请使用-CommandType
参数,例如-CommandType Cmdlet
答案 1 :(得分:17)
这是一个简单的功能,可以执行您喜欢的操作:)
function Check-Command($cmdname)
{
return [bool](Get-Command -Name $cmdname -ErrorAction SilentlyContinue)
}
如何使用(例如):
if (Check-Command -cmdname 'Invoke-WebRequest')
{
Invoke-WebRequest $link -OutFile $destination
}
else
{
$webclient.DownloadFile($link, $destination)
}
答案 2 :(得分:0)
如果命令采用动词名词形式,则可以将Get-Command与动词和名词参数一起使用。
# Usage:
if (Get-Command -Verb Invoke -Noun MyCommand) {
# cmdlet Invoke-MyCommand exists
}
Get-Command -Verb Get -Noun Item
# Output:
# CommandType Name Version Source
# ----------- ---- ------- ------
# Cmdlet Get-Item 7.0.0.0 #Microsoft.PowerShell.Management
Get-Command -Verb Take -Noun One
# No output.
function Take-One { [CmdletBinding()]param() }
Get-Command -Verb Take -Noun One
# Output:
# CommandType Name Version Source
# ----------- ---- ------- ------
# Function Take-One
在Windows PowerShell 5.1和PowerShell Core 7.0上进行了测试。
编辑2020-11-09 的附加示例。也是用法示例(改编自Keith Hill的答案)。