web-dev-qa-db-fra.com

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

J'ai un script auquel je passe le nom du serveur dans $ args.

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

.\script.ps1 Host1 Host2 Host3

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

J'aimerais 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 transmettez un paramètre -vlan mais si ce n'est pas le cas, le script attribue automatiquement le dernier nom de serveur à $vlan.

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

Idéalement, voici des exemples valides:

.\script.ps1 Host1
.\script.ps1 Host1 Host2 Host3
.\script.ps1 Host1 Host2 -vlan office
83
jcarpio

Le moyen le plus simple consiste probablement à 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 itérera une seule fois. Pour transmettre plusieurs hôtes au script, transmettez-le sous forme de tableau:

myScript.ps1 -Hosts Host1,Host2,Host3 -VLAN 2

... ou quelque chose de similaire.

154
Bill_Stewart

Les paramètres prennent en entrée avant les arguments. Vous devez plutôt 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
}

Puis appelez le comme:

.\script.ps1 Host1, Host2, Host3 -VLAN 2

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

21
Frode F.

Une façon de le faire serait la suivante:

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

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

14
Nitz