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