2010-01-28 4 views
323

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

Il semble qu'il y ait plusieurs réponses sur ce que la « meilleure » façon est 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 gérer cela mieux? Je sais que je réinvente la roue ici.

Evidemment ce que j'ai déjà n'est pas joli et sûrement n'est pas le "meilleur", mais ça marche .. et c'est DIGITANT.

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 

Répondre

604

Vous êtes en train de réinventer la roue. scripts normaux PowerShell ont des paramètres commençant par -, comme script.ps1 -server http://devserver

Ensuite, vous les manipulez à la section param au début du fichier (voir tutoriel: https://devcentral.f5.com/articles/powershell-abcs-p-is-for-parameters)

Vous pouvez également attribuer des valeurs par défaut à vos params, les lire 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") 
) 

A l'intérieur du 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, la $server obtient une valeur par défaut si le script est appelé sans elle, arrête script si vous ne spécifiez pas le paramètre -username et demande d'entrée terminal si -password est omis.

Mise à jour: Vous pourriez aussi bien 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 c'est le type de paramètre [switch]:

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

A l'intérieur du script travaillerait alors avec elle comme ceci:

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

Maintenant, lorsque vous appelez le script que vous souhaitez définir la commutateur/indicateur paramètre comme ceci:

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

Si vous voulez explicitement st a mangé que le drapeau est pas défini, il y a une syntaxe spéciale pour que

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

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

+5

AWESOME! Et marrant car à l'origine j'essayais d'utiliser param mais je m'en éloignais car je n'arrivais pas à comprendre la syntaxe. Lol merci! –

+33

En effet, l'un des grands avantages de PowerShell est qu'il fournit un paramètre standard d'analyse d'infrastructure facile à utiliser. –

+0

Vous avez "-site" dans l'exemple de ligne de commande et il ne correspond pas "[string] $ server" dans le script Est-ce une faute de frappe? – JasDev

Questions connexes