validate switch receive parameter mandatory powershell parameters

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.