如何在运行时通过脚本检查PowerShell中是否存在cmdlet

时间:2010-10-12 23:21:30

标签: powershell powershell-v2.0

我有一个需要在多个主机(PowerGUI,PowerShell ISE等)下运行的PowerShell脚本,但是我遇到了一个问题,即有时某个主机下不存在cmdlet。有没有办法检查cmdlet是否存在,以便我可以将代码包装在if块中,并在不存在时执行其他操作?

我知道我可以使用$host.name来划分在每台主机上运行的代码,但我希望使用Feature Detection代替将来添加cmdlet的情况。

我也可以使用try / catch块,但由于它在托管代码中运行,因此我假设有一些代码可以检测是否安装了cmdlet。

3 个答案:

答案 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的答案)。