Передача нескольких значений в один параметр сценария 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
Jcarpio
источник

Ответы:

178

Самый простой способ - это, вероятно, использовать два параметра: один для хостов (может быть массив) и один для vlan.

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

Вместо того

foreach ($i in $args)

ты можешь использовать

foreach ($hostName in $Hosts)

Если есть только один хост, цикл foreach будет повторяться только один раз. Чтобы передать скрипту несколько хостов, передайте его как массив:

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

... или что-то подобное.

Bill_Stewart
источник
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.
Sebastiaan M
Это должен быть лучший ответ.
Дмитро Иванов
-6

Я вызываю запланированный сценарий, который должен подключиться к списку серверов следующим образом:

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

Затем внутри скрипта:

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

Оператор разделения возвращает массив строк

BR1COP
источник