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
小智 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)
如果命令采用动词-名词形式,则可以使用带有动词和名词参数的 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 的回答)。
| 归档时间: |
|
| 查看次数: |
32785 次 |
| 最近记录: |