Übergeben mehrerer Werte an einen einzelnen PowerShell-Skriptparameter

96

Ich habe ein Skript, an das ich Servernamen in $ args übergebe.

Auf diese Weise kann ich mit diesen Servern Folgendes tun foreach:

.\script.ps1 host1 host2 host3

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

Ich möchte einen benannten optionalen Parameter namens vlan hinzufügen. Ich habe es versucht:

Param(
    [string]$vlan
)

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

Dies funktioniert, wenn Sie einen -vlanParameter übergeben. Wenn Sie dies nicht tun, weist das Skript automatisch den letzten Servernamen zu $vlan.

Wie können Sie also einzelne oder mehrere Parameter sowie einen optionalen benannten Parameter an ein PowerShell-Skript übergeben?

Im Idealfall sind hier gültige Beispiele:

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

Antworten:

177

Am einfachsten ist es wahrscheinlich, zwei Parameter zu verwenden: einen für Hosts (kann ein Array sein) und einen für vlan.

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

Anstatt

foreach ($i in $args)

Sie können verwenden

foreach ($hostName in $Hosts)

Wenn nur ein Host vorhanden ist, wird die foreach-Schleife nur einmal wiederholt. Um mehrere Hosts an das Skript zu übergeben, übergeben Sie es als Array:

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

...oder etwas ähnliches.

Bill_Stewart
quelle
7
Vielen Dank, dass Sie die Informationen zum Aufrufen des Skripts hinzugefügt haben. Oft fehlen mir solche kleinen Teile in Powershell.
Jan Bühler
23

Parameter werden vor Argumenten eingegeben. Stattdessen sollten Sie einen Parameter hinzufügen, der ein Array akzeptiert, und es zum ersten Positionsparameter machen. Ex:

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

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

Dann nenne es wie:

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

Beachten Sie das Komma zwischen den Werten. Dies sammelt sie in einem Array

Frode F.
quelle
18

Ein Weg, dies zu tun, wäre folgender:

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

Dies würde die Eingabe mehrerer Hosts mit Leerzeichen ermöglichen.

Nitz
quelle
Wirklich nett! Außer in Ihrem Beispiel fehlt ein ']', um das zweite Parameterattribut zu schließen.
Sebastiaan M
-5

Ich rufe ein geplantes Skript auf, das auf folgende Weise eine Verbindung zu einer Liste von Servern herstellen muss:

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

Dann im Skript:

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

Der Split-Operator gibt ein Array von Zeichenfolgen zurück

BR1COP
quelle