Passer plusieurs valeurs à un seul paramètre de script PowerShell


96

J'ai un script auquel je passe le (s) nom (s) de serveur en $ args.

De cette façon, je peux faire des choses sur ce (ces) serveur (s) en utilisant foreach:

.\script.ps1 host1 host2 host3

foreach ($i in $args)
{
    Do-Stuff $i
}

Je voudrais ajouter un paramètre facultatif nommé appelé vlan. J'ai essayé:

Param(
    [string]$vlan
)

foreach ($i in $args)
{
    Write-Host $i
}
Write-Host $vlan

Cela fonctionne si vous passez un -vlanparamètre mais si vous ne le faites pas, le script attribue automatiquement le dernier nom de serveur à $vlan.

Alors, comment pouvez-vous transmettre un ou plusieurs paramètres plus un paramètre nommé facultatif à un script PowerShell?

Idéalement, voici des exemples valables:

.\script.ps1 host1
.\script.ps1 host1 host2 host3
.\script.ps1 host1 host2 -vlan office

Réponses:


177

Le moyen le plus simple est probablement d'utiliser deux paramètres: un pour les hôtes (peut être un tableau) et un pour vlan.

param([String[]] $Hosts, [String] $VLAN)

Au lieu de

foreach ($i in $args)

vous pouvez utiliser

foreach ($hostName in $Hosts)

S'il n'y a qu'un seul hôte, la boucle foreach n'itérera qu'une seule fois. Pour transmettre plusieurs hôtes au script, transmettez-le en tant que tableau:

myScript.ps1 -Hosts host1,host2,host3 -VLAN 2

... ou quelque chose de similaire.


7
merci d'avoir inclus les informations sur la façon d'appeler le script - il me manque souvent de petits morceaux comme celui-ci dans PowerShell.
Jan Bühler

23

Les paramètres prennent l'entrée avant les arguments. Ce que vous devez faire à la place, c'est ajouter un paramètre qui accepte un tableau et en faire le premier paramètre de position. ex:

param(
    [Parameter(Position = 0)]
    [string[]]$Hosts,
    [string]$VLAN
    )

foreach ($i in $Hosts)  
{ 
    Do-Stuff $i
}

Alors appelez-le comme:

.\script.ps1 host1, host2, host3 -VLAN 2

Notez la virgule entre les valeurs. Cela les rassemble dans un tableau


19

Une façon de le faire serait comme ceci:

 param(
       [Parameter(Position=0)][String]$Vlan,
       [Parameter(ValueFromRemainingArguments=$true)][String[]]$Hosts
    ) ...

Cela permettrait d'entrer plusieurs hôtes avec des espaces.


Vraiment sympa! Sauf que votre exemple manque un ']' pour fermer le deuxième attribut de paramètre.
Sebastiaan M

Celui-ci devrait être la meilleure réponse.
Дмитро Іванов

-5

J'appelle un script planifié qui doit se connecter à une liste de serveurs de cette façon:

Powershell.exe -File "YourScriptPath" "Par1,Par2,Par3"

Puis à l'intérieur du script:

param($list_of_servers)
...
Connect-Viserver $list_of_servers.split(",")

L'opérateur split renvoie un tableau de chaîne

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.