2010-10-12 175 views
35

我有一个PowerShell脚本,需要在多台主机(PowerGUI的,PowerShell ISE,等...)运行中存在cmdlet的,但我有一个问题,有时一个小命令没有按其中一位主持人不存在。有没有办法检查cmdlet是否存在,以便我可以将代码包装在if块中,并在不存在时执行其他操作?如何检查是否在PowerShell中运行时通过脚本

我知道我可以使用$host.name来区分假设在每个主机上运行的代码,但我宁愿使用Feature Detection,以防将来添加该cmdlet。

我也可以用try/catch块,但由于它在托管代码运行我假设有路程,如果通过代码安装cmdlet来检测。

回答

75

使用Get-Command cmdlet来测试cmdlet的存在:

if (Get-Command $cmdName -errorAction SilentlyContinue) 
{ 
    "$cmdName exists" 
} 

如果你想以确保它是一个小命令(而不是一个exe或函数或脚本)使用-CommandType参数如-CommandType Cmdlet

+0

不知道有一个errorAction参数。在这里找到所有常用参数的列表:http://msdn.microsoft.com/en-us/library/dd901844(VS.85).aspx这是很好的知道。谢谢! – 2010-10-13 01:39:48

+6

注意:您也可以使用if(get-module | Where-Object {$ _。Name -eq“ServerManager”}){{“Module Exists”}}来检查模块。更多详细信息:http://stackoverflow.com/questions/10027156/how-to-import-system-modules-automatically – 2012-05-30 18:12:25

+0

cmdlet可能存在,但不可用。很好的例子:Windows 2003上存在Get-WinEvent,但它引发NotImplemented异常。你将如何处理这种情况? – Neolisk 2012-09-17 18:24:52

9

这是一个简单的功能做你喜欢什么做:)

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) 
} 
相关问题