2013-02-27 15 views
40

Mam skrypt, do którego przekazuję nazwę (y) serwera w $ args.Przekazywanie wielu wartości do pojedynczego parametru skryptu PowerShell

ten sposób można robić rzeczy, do tego (tych) serwera (ów) z zastosowaniem foreach:

.\script.ps1 host1 host2 host3 

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

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

Param(
    [string]$vlan 
) 

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

Działa jeśli przekazać parametr -vlan ale jeśli nie to auto skrypt przypisuje nazwisko serwera do $vlan.

Jak zatem przekazać jeden lub wiele parametrów plus opcjonalnie nazwany parametr do skryptu PowerShell?

Idealnie, tutaj ważne przykłady:

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

Odpowiedz

84

Najprostszym sposobem jest prawdopodobnie wykorzystać dwa parametry: jeden dla gospodarzy (może być tablicą) i jeden dla sieci VLAN.

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

Zamiast

foreach ($i in $args) 

można użyć

foreach ($hostName in $Hosts) 

Jeśli jest tylko jeden gospodarz, pętla foreach będzie iteracyjne tylko raz. Aby przekazać wiele hostów do skryptu, należy przekazać go jako tablicę:

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

... lub coś podobnego.

Rachunek

+0

dzięki za informacje o tym, jak wywołać scenariusz - często brakuje mi takich drobiazgów w grze Power Shell. –

14

Parametry pobierają dane wejściowe przed argumentami. Zamiast tego należy dodać parametr, który akceptuje tablicę i uczynić go parametrem pierwszej pozycji. ex:

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

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

Następnie nazwać to lubią:

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

Wskazówka przecinek między wartościami. Ten zbiera je w tablicy

0

Wzywam zaplanowanego scenariusza, który należy podłączyć do listy Server 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 Podział zwraca array of string

1

Jeden sposób zrobienia tego byłby następujący:

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

Umożliwi to wprowadzanie wielu hostów ze spacjami.

Powiązane problemy