Truyền nhiều giá trị cho một tham số tập lệnh PowerShell


96

Tôi có một tập lệnh mà tôi chuyển (các) tên máy chủ vào $ args.

Bằng cách này, tôi có thể thực hiện công việc với (các) máy chủ này bằng cách sử dụng foreach:

.\script.ps1 host1 host2 host3

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

Tôi muốn thêm một tham số tùy chọn có tên là vlan. Tôi đã thử:

Param(
    [string]$vlan
)

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

Nó hoạt động nếu bạn truyền một -vlantham số nhưng nếu bạn không chuyển thì script sẽ tự động gán tên máy chủ cuối cùng cho $vlan.

Vì vậy, làm cách nào bạn có thể chuyển một hoặc nhiều tham số cộng với một tham số có tên tùy chọn vào tập lệnh PowerShell?

Tốt nhất, đây là các ví dụ hợp lệ:

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

Câu trả lời:


177

Cách dễ nhất có lẽ là sử dụng hai tham số: Một cho máy chủ (có thể là một mảng) và một cho vlan.

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

Thay vì

foreach ($i in $args)

bạn có thể dùng

foreach ($hostName in $Hosts)

Nếu chỉ có một máy chủ lưu trữ, vòng lặp foreach sẽ chỉ lặp lại một lần. Để chuyển nhiều máy chủ cho tập lệnh, hãy chuyển nó dưới dạng một mảng:

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

... hoặc một cái gì đó tương tự.


7
cảm ơn vì đã cung cấp thông tin về cách gọi script - tôi thường thiếu những phần nhỏ như thế trong powershell.
Jan Bühler

23

Tham số nhận đầu vào trước đối số. Thay vào đó, những gì bạn nên làm là thêm một tham số chấp nhận một mảng và đặt nó trở thành tham số vị trí đầu tiên. Ví dụ:

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

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

Sau đó gọi nó như:

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

Chú ý dấu phẩy giữa các giá trị. Điều này thu thập chúng trong một mảng


19

Một cách để làm điều đó sẽ như thế này:

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

Điều này sẽ cho phép nhiều máy chủ được nhập với dấu cách.


Thực sự tốt đẹp! Ngoại trừ ví dụ của bạn thiếu dấu ']' để đóng thuộc tính Tham số thứ hai.
Sebastiaan M

Đây là câu trả lời tốt nhất.
Дмитро Іванов

-5

Tôi gọi một kịch bản đã lên lịch phải kết nối với danh sách Máy chủ theo cách này:

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

Sau đó, bên trong tập lệnh:

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

Toán tử tách trả về một mảng chuỗi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.