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
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.
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
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.