การส่งผ่านหลายค่าไปยังพารามิเตอร์สคริปต์ PowerShell เดียว


102

ฉันมีสคริปต์ที่ฉันส่งชื่อเซิร์ฟเวอร์ใน $ args

ด้วยวิธีนี้ฉันสามารถทำสิ่งต่างๆกับเซิร์ฟเวอร์ (เหล่านี้) โดยใช้foreach:

.\script.ps1 host1 host2 host3

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

ฉันต้องการเพิ่มพารามิเตอร์ทางเลือกที่มีชื่อเรียกว่า vlan ฉันพยายามแล้ว:

Param(
    [string]$vlan
)

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

มันทำงานได้ถ้าคุณผ่าน-vlanพารามิเตอร์ $vlanแต่ถ้าคุณทำไม่ได้แล้วอัตโนมัติสคริปต์ที่กำหนดชื่อเซิร์ฟเวอร์สุดท้ายที่จะ

ดังนั้นคุณจะส่งพารามิเตอร์เดี่ยวหรือหลายตัวพร้อมพารามิเตอร์ที่มีชื่อเป็นตัวเลือกไปยังสคริปต์ PowerShell ได้อย่างไร

ตามหลักการแล้วนี่คือตัวอย่างที่ถูกต้อง:

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

คำตอบ:


185

วิธีที่ง่ายที่สุดคือการใช้สองพารามิเตอร์: หนึ่งสำหรับโฮสต์ (อาจเป็นอาร์เรย์) และอีกพารามิเตอร์หนึ่งสำหรับ vlan

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

แทน

foreach ($i in $args)

คุณสามารถใช้ได้

foreach ($hostName in $Hosts)

หากมีโฮสต์เพียงโฮสต์เดียว foreach loop จะวนซ้ำเพียงครั้งเดียว ในการส่งโฮสต์หลายตัวไปยังสคริปต์ให้ส่งผ่านเป็นอาร์เรย์:

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

... หรือสิ่งที่คล้ายกัน


8
ขอบคุณที่รวมข้อมูลเกี่ยวกับวิธีการเรียกสคริปต์ - ฉันมักจะพลาดชิ้นส่วนเล็ก ๆ เช่นนั้นใน powershell
ม.ค. Bühler

23

พารามิเตอร์รับอินพุตก่อนอาร์กิวเมนต์ สิ่งที่คุณควรทำแทนคือเพิ่มพารามิเตอร์ที่รับอาร์เรย์และทำให้เป็นพารามิเตอร์ตำแหน่งแรก เช่น:

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

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

จากนั้นเรียกมันว่า:

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

สังเกตลูกน้ำระหว่างค่า สิ่งนี้รวบรวมไว้ในอาร์เรย์


20

วิธีหนึ่งที่จะทำได้ดังนี้:

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

ซึ่งจะทำให้สามารถป้อนโฮสต์หลาย ๆ โฮสต์ได้โดยเว้นวรรค


ดีจริงๆ! ยกเว้นตัวอย่างของคุณไม่มี "]" เพื่อปิดแอตทริบิวต์พารามิเตอร์ที่สอง
Sebastiaan M

1
อันนี้น่าจะตอบโจทย์ที่สุด
ДмитроІванов

นี่คือวิธีที่
CrazyIvan1974

-7

ฉันเรียกสคริปต์ที่กำหนดเวลาไว้ซึ่งต้องเชื่อมต่อกับรายการเซิร์ฟเวอร์ด้วยวิธีนี้:

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

จากนั้นภายในสคริปต์:

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

ตัวดำเนินการแยกส่งคืนอาร์เรย์ของสตริง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.