Передача кількох значень до одного параметра сценарію PowerShell


96

У мене є сценарій, якому я передаю імена серверів у $ 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

Відповіді:


177

Найпростіший спосіб - це, мабуть, використовувати два параметри: один для хостів (може бути масивом), а другий для vlan.

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

Замість

foreach ($i in $args)

ви можете використовувати

foreach ($hostName in $Hosts)

Якщо існує лише один хост, цикл foreach повторюватиметься лише один раз. Щоб передати сценарію кілька хостів, передайте його як масив:

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

... або щось подібне.


7
дякую, що включили інформацію про те, як викликати сценарій - я часто пропускаю такі маленькі шматочки у PowerShell.
Ян Бюлер,

23

Параметри беруть введення перед аргументами. Натомість вам слід додати параметр, що приймає масив, і зробити його першим параметром позиції. напр .:

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

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

Тоді назвіть це так:

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

Зверніть увагу на кому між значеннями. Це збирає їх у масив


19

Один із способів зробити це буде таким:

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

Це дозволило б вводити декілька хостів із пробілами.


Дійсно приємно! За винятком того, що у вашому прикладі не вистачає символу ']', щоб закрити другий атрибут Parameter.
Себастіан М

Це має бути найкращою відповіддю.
Дмитро Іванов

-5

Я називаю запланований сценарій, який повинен підключитися до списку Сервера таким чином:

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

Потім всередині сценарію:

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

Оператор split повертає масив рядків

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.