2010-10-12 15 views
35

Birden çok ana bilgisayar (PowerGUI, PowerShell ISE, vb.) Altında çalışması gereken bir PowerShell betiğim var, ancak bazen bir cmdlet'in olmadığı bir sorun yaşıyorum ana bilgisayarlardan birinin altında var. Bir cmdlet'in var olup olmadığını kontrol etmenin bir yolu var mı, böylece kodu bir if bloğunda sarabilirim ve yokken başka bir şey yapabilirim?Komut dosyası aracılığıyla çalışma zamanında PowerShell'de bir cmdlet'in var olup olmadığını nasıl kontrol edebilirim?

Her ana bilgisayarda çalışmayı düşündüğüm kodu bölümlemek için $host.name numaralı telefonu kullanabileceğimi biliyorum, ancak cmdlet'in gelecekte eklenmesi durumunda bunun yerine Feature Detection kullanmayı tercih ediyorum.

Ayrıca bir try/catch bloğu kullanabilirim, ancak yönetilen kodda çalıştığı için kod aracılığıyla bir cmdlet'in yüklenip yüklenmediğini algılayacağımı varsayarım.

cevap

75

bir cmdlet'inin varlığını sınamak için Get-Command cmdlet'ini kullanın:

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

Ve bunu bir cmdlet (ve bir exe veya işlev veya script) -CommandType parametre örneğin kullanmaktır sağlamak istiyorsanız -CommandType Cmdlet

+0

Bir errorAction parametresi olduğunu bilmiyordum. Tüm Ortak Parametreler listesini burada bulabilirsiniz: http://msdn.microsoft.com/en-us/library/dd901844(VS.85).aspx bilmek güzel. Teşekkürler! –

+6

NOT: Ayrıca, 'if (get-module | Where-Object {$ _. Name -eq" ServerManager "}) {" Module Exists "}' i kullanarak Modülleri de kontrol edebilirsiniz. Daha fazla detay: http://stackoverflow.com/questions/10027156/how-to-import-system-modules-automatically –

+0

cmdlet mevcut olabilir, ancak mevcut olmayabilir. İyi örnek: Windows 2003'te Get-WinEvent var, ancak NotImplemented istisnasını atar. Bu durumu nasıl ele alırsın? – Neolisk

9

Bu yapmanız :)

function Check-Command($cmdname) 
{ 
    return [bool](Get-Command -Name $cmdname -ErrorAction SilentlyContinue) 
} 

nasıl (örneğin) kullanmak gibisin ne yapacağını basit bir fonksiyonudur:

if (Check-Command -cmdname 'Invoke-WebRequest') 
{ 
    Invoke-WebRequest $link -OutFile $destination 
} 
else 
{ 
    $webclient.DownloadFile($link, $destination) 
} 
İlgili konular