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
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):