switch - Pasar múltiples valores a un solo parámetro de script de PowerShell
powershell validate parameter (4)
La forma más fácil es, probablemente, utilizar dos parámetros: uno para los hosts (puede ser una matriz) y otro para vlan.
param([String[]] $Hosts, [String] $VLAN)
En lugar de
foreach ($i in $args)
puedes usar
foreach ($hostName in $Hosts)
Si solo hay un host, el ciclo foreach solo se repetirá una vez. Para pasar múltiples hosts al script, páselo como una matriz:
myScript.ps1 -Hosts host1,host2,host3 -VLAN 2
...o algo similar.
Cuenta
Tengo un script al que paso el nombre del servidor en $ args.
De esta forma puedo hacer cosas a este (estos) servidor (es) usando foreach
:
./script.ps1 host1 host2 host3
foreach ($i in $args)
{
Do-Stuff $i
}
Me gustaría agregar un parámetro opcional llamado vlan. He intentado:
Param(
[string]$vlan
)
foreach ($i in $args)
{
Write-Host $i
}
Write-Host $vlan
Funciona si pasa un parámetro -vlan
pero si no lo hace, el script automáticamente asigna el último nombre del servidor a $vlan
.
Entonces, ¿cómo puede pasar parámetros únicos o múltiples más un parámetro nombrado opcional a un script de PowerShell?
Idealmente, aquí hay ejemplos válidos:
./script.ps1 host1
./script.ps1 host1 host2 host3
./script.ps1 host1 host2 -vlan office
Llamo a un script programado que debe conectarse a una lista de servidores de esta manera:
Powershell.exe -File "YourScriptPath" "Par1,Par2,Par3"
Luego dentro del script:
param($list_of_servers)
...
Connect-Viserver $list_of_servers.split(",")
El operador split devuelve una matriz de cadena
Los parámetros toman entrada antes de los argumentos. Lo que debe hacer en su lugar es agregar un parámetro que acepte una matriz y convertirlo en el primer parámetro de posición. ex:
param(
[Parameter(Position = 0)]
[string[]]$Hosts,
[string]$VLAN
)
foreach ($i in $Hosts)
{
Do-Stuff $i
}
Entonces llámalo así:
./script.ps1 host1, host2, host3 -VLAN 2
Observe la coma entre los valores. Esto los recoge en una matriz
Una forma de hacerlo sería así:
param(
[Parameter(Position=0)][String]$Vlan,
[Parameter(ValueFromRemainingArguments=$true)][String[]]$Hosts
) ...
Esto permitiría que múltiples hosts sean ingresados con espacios.