Ü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.