2010-10-12 180 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) 
} 
相關問題