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

Gre*_*ray 50 powershell powershell-2.0

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

我知道我可以使用它$host.name来划分在每个主机上运行的代码,但我更愿意使用功能检测,以防将来添加cmdlet.

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

Kei*_*ill 109

使用Get-Commandcmdlet测试是否存在cmdlet:

if (Get-Command $cmdName -errorAction SilentlyContinue)
{
    "$cmdName exists"
}
Run Code Online (Sandbox Code Playgroud)

如果您想确保它是cmdlet(而不是exe或函数或脚本),请使用-CommandType参数eg-CommandType Cmdlet

  • 注意:您还可以使用`if(get-module | Where-Object {$ _.Name -eq"ServerManager"}){"Module Exists"}`来检查模块.更多细节:http://stackoverflow.com/questions/10027156/how-to-import-system-modules-automatically (7认同)
  • 不知道有一个 errorAction 参数。在这里找到所有通用参数的列表:http://msdn.microsoft.com/en-us/library/dd901844(VS.85).aspx 很高兴知道。谢谢! (2认同)

小智 19

这是一个简单的功能,可以做你想做的事:)

function Check-Command($cmdname)
{
    return [bool](Get-Command -Name $cmdname -ErrorAction SilentlyContinue)
}
Run Code Online (Sandbox Code Playgroud)

如何使用(例如):

if (Check-Command -cmdname 'Invoke-WebRequest')
{
     Invoke-WebRequest $link -OutFile $destination
}
else
{
     $webclient.DownloadFile($link, $destination)
}
Run Code Online (Sandbox Code Playgroud)


use*_*908 5

如果命令采用动词-名词形式,则可以使用带有动词和名词参数的 Get-Command。

# Usage:
if (Get-Command -Verb Invoke -Noun MyCommand) {
  # cmdlet Invoke-MyCommand exists
}
Run Code Online (Sandbox Code Playgroud)
Get-Command -Verb Get -Noun Item

# Output:
# CommandType     Name                  Version    Source
# -----------     ----                  -------    ------
# Cmdlet          Get-Item              7.0.0.0    #Microsoft.PowerShell.Management
Run Code Online (Sandbox Code Playgroud)
Get-Command -Verb Take -Noun One

# No output.
Run Code Online (Sandbox Code Playgroud)
function Take-One { [CmdletBinding()]param() }
Get-Command -Verb Take -Noun One

# Output:
# CommandType     Name                   Version    Source
# -----------     ----                   -------    ------
# Function        Take-One
Run Code Online (Sandbox Code Playgroud)

在 Windows PowerShell 5.1 和 PowerShell Core 7.0 上进行了测试。

编辑 2020-11-09附加示例。还有用法示例(改编自 Keith Hill 的回答)。