Przekazywanie wielu wartości do pojedynczego parametru skryptu programu PowerShell

99

Mam skrypt, do którego przekazuję nazwę (y) serwera w $ args.

W ten sposób mogę robić rzeczy na tym (tych) serwerze (ach) używając foreach:

.\script.ps1 host1 host2 host3

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

Chciałbym dodać nazwany opcjonalny parametr o nazwie vlan. Próbowałem:

Param(
    [string]$vlan
)

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

Działa, jeśli przekażesz -vlanparametr, ale jeśli tego nie zrobisz, skrypt automatycznie przypisze ostatnią nazwę serwera $vlan.

Jak więc można przekazać jeden lub wiele parametrów oraz opcjonalny nazwany parametr do skryptu programu PowerShell?

Idealnie, oto ważne przykłady:

.\script.ps1 host1
.\script.ps1 host1 host2 host3
.\script.ps1 host1 host2 -vlan office
jcarpio
źródło

Odpowiedzi:

182

Najłatwiejszym sposobem jest prawdopodobnie użycie dwóch parametrów: jednego dla hostów (może to być tablica) i jednego dla sieci VLAN.

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

Zamiast

foreach ($i in $args)

możesz użyć

foreach ($hostName in $Hosts)

Jeśli jest tylko jeden host, pętla foreach dokona iteracji tylko raz. Aby przekazać wiele hostów do skryptu, przekaż go jako tablicę:

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

... lub coś podobnego.

Bill_Stewart
źródło
7
dzięki za dołączenie informacji o tym, jak wywołać skrypt - często brakuje mi takich małych elementów w PowerShell.
Jan Bühler
23

Parametry przyjmują dane wejściowe przed argumentami. Zamiast tego powinieneś dodać parametr, który akceptuje tablicę i ustawić go jako parametr pierwszej pozycji. dawny:

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

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

Następnie nazwij to tak:

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

Zwróć uwagę na przecinek między wartościami. To zbiera je w tablicy

Frode F.
źródło
20

Można to zrobić następująco:

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

Umożliwiłoby to wprowadzenie wielu hostów ze spacjami.

Nitz
źródło
Naprawdę nieźle! Z wyjątkiem tego, że w Twoim przykładzie brakuje znaku „]”, aby zamknąć drugi atrybut parametru.
Sebastiaan M
1
Ta powinna być najlepszą odpowiedzią.
Дмитро Іванов
To jest sposób.
CrazyIvan1974
-6

Wywołuję zaplanowany skrypt, który musi połączyć się z listą serwerów w ten sposób:

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

Następnie wewnątrz skryptu:

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

Operator split zwraca tablicę ciągów

BR1COP
źródło