web-dev-qa-db-fra.com

Comment gérer les arguments de ligne de commande dans PowerShell

Quel est le "meilleur" moyen de gérer les arguments en ligne de commande?

Il semble y avoir plusieurs réponses sur la "meilleure" façon de faire et, par conséquent, je suis coincé sur la façon de gérer quelque chose d'aussi simple que:

script.ps1 /n name /d domain

ET

script.ps1 /d domain /n name.

Y at-il un plugin qui peut mieux gérer cela? Je sais que je réinvente la roue ici.

Évidemment, ce que j’ai déjà n’est pas joli et ce n’est sûrement pas le "meilleur", mais ça marche ... et c’est moche.

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
442
Aaron Wurthmann

Vous réinventez la roue. Les scripts PowerShell normaux ont des paramètres commençant par -, comme script.ps1 -server http://devserver

Ensuite, vous les manipulerez dans la section param au début du fichier.

Vous pouvez également affecter des valeurs par défaut à vos paramètres, les lire à partir de la console si non disponible ou arrêter l'exécution du script:

 param (
    [string]$server = "http://defaultserver",
    [Parameter(Mandatory=$true)][string]$username,
    [string]$password = $( Read-Host "Input password, please" )
 )

Dans le script, vous pouvez simplement

write-output $server

puisque tous les paramètres deviennent des variables disponibles dans la portée du script.

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

Mise à jour: vous pouvez également souhaiter passer un "indicateur" (paramètre booléen true/false) à un script PowerShell. Par exemple, votre script peut accepter une "force" dans laquelle le script s'exécute dans un mode plus prudent lorsque la force n'est pas utilisée.

Le mot clé correspondant est [switch] type de paramètre:

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

Dans le script, vous travaillerez comme ceci:

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

Lorsque vous appelez le script, définissez le paramètre switch/flag de la manière suivante:

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

Si vous souhaitez explicitement indiquer que l'indicateur n'est pas défini, il existe une syntaxe spéciale pour cela.

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

Liens vers la documentation Microsoft pertinente (pour PowerShell 5.0; les versions 3.0 et 4.0 sont également disponibles sur les liens):

818
naivists