Passaggio di più valori a un singolo parametro di script di PowerShell


96

Ho uno script a cui passo i nomi dei server in $ args.

In questo modo posso fare cose a questo (questi) server usando foreach:

.\script.ps1 host1 host2 host3

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

Vorrei aggiungere un parametro opzionale denominato chiamato vlan. Ho provato:

Param(
    [string]$vlan
)

foreach ($i in $args)
{
    Write-Host $i
}
Write-Host $vlan

Funziona se si passa un -vlanparametro, ma se non lo si fa, lo script assegna automaticamente l'ultimo nome del server a $vlan.

Quindi, come passare uno o più parametri più un parametro denominato facoltativo a uno script di PowerShell?

Idealmente, ecco esempi validi:

.\script.ps1 host1
.\script.ps1 host1 host2 host3
.\script.ps1 host1 host2 -vlan office

Risposte:


177

Il modo più semplice è probabilmente quello di utilizzare due parametri: uno per gli host (può essere un array) e uno per vlan.

param([String[]] $Hosts, [String] $VLAN)

Invece di

foreach ($i in $args)

Puoi usare

foreach ($hostName in $Hosts)

Se è presente un solo host, il ciclo foreach itererà solo una volta. Per passare più host allo script, passalo come array:

myScript.ps1 -Hosts host1,host2,host3 -VLAN 2

... o qualcosa di simile.


7
grazie per aver incluso le informazioni su come chiamare lo script - spesso mi mancano piccoli pezzi come quello in PowerShell.
Jan Bühler

23

I parametri accettano input prima degli argomenti. Quello che dovresti fare invece è aggiungere un parametro che accetta un array e renderlo il primo parametro di posizione. ex:

param(
    [Parameter(Position = 0)]
    [string[]]$Hosts,
    [string]$VLAN
    )

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

Quindi chiamalo come:

.\script.ps1 host1, host2, host3 -VLAN 2

Notare la virgola tra i valori. Questo li raccoglie in una matrice


19

Un modo per farlo sarebbe così:

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

Ciò consentirebbe di inserire più host con spazi.


Veramente bello! Tranne che nel tuo esempio manca un "]" per chiudere il secondo attributo Parameter.
Sebastiaan M

Questa dovrebbe essere la risposta migliore.
Дмитро Іванов

-5

Chiamo uno script pianificato che deve connettersi a un elenco di server in questo modo:

Powershell.exe -File "YourScriptPath" "Par1,Par2,Par3"

Quindi all'interno dello script:

param($list_of_servers)
...
Connect-Viserver $list_of_servers.split(",")

L'operatore di divisione restituisce un array di stringhe

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.