Ü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

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.


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


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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.