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

Quelle est la" meilleure " façon de gérer les arguments de ligne de commande?

Il semble qu'il y ait plusieurs réponses sur ce qu'est le "meilleur" moyen 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 a-t-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 n'est sûrement pas le "meilleur", mais ça marche.. et il 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
366
demandé sur Ryan Gates 2010-01-28 23:01:10

1 réponses

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 gérez dans la section param au début du fichier.

Vous pouvez également attribuer des valeurs par défaut à vos paramètres, les lire depuis la console si elles ne sont pas disponibles 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 elle, le script s'arrête si vous omettez le paramètre -username et demande l'entrée du terminal si -password est omis.

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

Le mot clé pour cela 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 travailleriez avec comme ceci:

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

Maintenant, lorsque vous appelez le script, vous définissez le paramètre switch / flag comme ceci:

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

Si vous voulez 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; Tho versions 3.0 et 4.0 sont également disponibles à la les liens):

692
répondu naivists 2018-08-17 18:37:13