2010-10-12 5 views
35

J'ai un script PowerShell qui doit s'exécuter sous plusieurs hôtes (PowerGUI, PowerShell ISE, etc ...), mais j'ai parfois un problème où une cmdlet n'existe pas sous l'un des hôtes. Existe-t-il un moyen de vérifier si une cmdlet existe pour que je puisse envelopper le code dans un bloc if et faire autre chose quand il n'existe pas?Comment vérifier si une applet de commande existe dans PowerShell à l'exécution via le script

Je sais que je pourrais utiliser le $host.name pour sectionner le code supposé s'exécuter sur chaque hôte, mais je préférerais utiliser Feature Detection à la place au cas où la cmdlet serait ajoutée dans le futur.

Je pourrais aussi utiliser un bloc try/catch, mais étant donné qu'il s'exécute en code managé, je suppose qu'il y a loin de détecter si une cmdlet est installée via du code.

Répondre

75

Utilisez l'applet de commande Get-Command pour tester l'existence d'une applet de commande:

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

Et si vous voulez vous assurer qu'il est une applet de commande (et non un exe ou une fonction ou d'un script), utilisez le paramètre -CommandType par exemple -CommandType Cmdlet

+0

Je ne savais pas qu'il y avait un paramètre errorAction. Trouvé la liste de tous les paramètres communs ici: http://msdn.microsoft.com/en-us/library/dd901844(VS.85).aspx ce qui est bon à savoir. Merci! –

+6

REMARQUE: vous pouvez également rechercher des modules en utilisant 'if (get-module | Where-Object {$ _. Nom -eq" ServerManager "}) {" Module existant "}'. Plus de détails: http://stackoverflow.com/questions/10027156/how-to-import-system-modules-automatically –

+0

cmdlet peut exister, mais ne pas être disponible. Bon exemple: Get-WinEvent existe sur Windows 2003, mais il déclenche une exception NotImplemented. Comment gérez-vous cette situation? – Neolisk

9

Cette fonction est simple à faire ce que vous êtes comme à faire :)

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

Comment utiliser (par exemple):

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