566 votes

Comment traiter des Arguments de ligne de commande dans PowerShell

Je suis vraiment très coincé sur quelque chose ce matin. Le "meilleur" moyen de gérer les arguments de ligne de commande. Il semble comme il y a plusieurs réponses sur ce qu'est la "meilleure" façon est et en conséquence, je suis coincé sur la façon de gérer quelque chose d'aussi simple que: script.ps1 /n nom de /d domaine ET de script.ps1 /d domaine /n nom.

Est-il un plugin qui permet de gérer ce mieux? Je sais que je suis en train de réinventer la roue ici.

De toute évidence ce que j'ai déjà n'est pas joli et sûrement n'est pas le "meilleur", mais il fonctionne.. et c'est LAID.

for ( $i = 0; $i -lt $args.count; $i++ ) {
        if ($args[ $i ] -eq "/n"){ $strName=$args[ $i+1 ]}
        if ($args[ $i ] -eq "-n"){ $strName=$args[ $i+1 ]}
        if ($args[ $i ] -eq "/d"){ $strDomain=$args[ $i+1 ]}
        if ($args[ $i ] -eq "-d"){ $strDomain=$args[ $i+1 ]}
}
Write-Host $strName
Write-Host $strDomain

1061voto

naivists Points 15639

Vous êtes en train de réinventer la roue. Normal scripts PowerShell ont des paramètres de départ avec -, comme script.ps1 -server http://devserver

Puis de les manipuler en param section dans le début du fichier (voir le tutoriel: http://devcentral.f5.com/weblogs/Joe/archive/2009/01/13/powershell-abcs---p-is-for-parameters.aspx)

Vous pouvez également affecter des valeurs par défaut pour votre params, de les lire à partir de la console en cas de non disponibilité ou d'arrêter l'exécution du script:

 param (
    [string]$server = "http://defaultserver",
    [string]$username = $(throw "-username is required."),
    [string]$password = $( Read-Host "Input password, please" )
 )

Dans le script, vous pouvez tout simplement

write-output $server

puisque tous les paramètres sont des variables disponibles dans le script de la portée.

Dans cet exemple, l' $server obtient une valeur par défaut si le script est appelé sans elle, le script s'arrête si vous omettez l' -username de paramètre et de la demande d'entrée de la borne s' -password est omis.

Mise à jour: Vous pourriez aussi bien souhaitez passer un "drapeau" (un booléen (true/false paramètre) pour un script PowerShell. Par exemple, votre script peut accepter une "force" où le script s'exécute dans une plus prudent mode lorsque la force n'est pas utilisée.

Le mot clé, c'est - [switch] type de paramètre:

 param (
    [string]$server = "http://defaultserver",
    [string]$password = $( Read-Host "Input password, please" ),
    [switch]$force = $false
 )

Dans le script, alors vous pouvez travailler avec elle comme ceci:

if ($force) {
  //deletes a file or does something "bad"
}

Maintenant, lors de l'appel du script, vous définissez le commutateur/indicateur de paramètre comme ceci:

.\yourscript.ps1 -server "http://otherserver" -force

Si vous souhaitez explicitement à l'état du pavillon n'est pas défini, il y a une syntaxe particulière pour que

.\yourscript.ps1 -server "http://otherserver" -force:$false

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X