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
jcarpio
la source

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.

Bill_Stewart
la source
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

Frode F.
la source
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.

Nitz
la source
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

BR1COP
la source