Передача нескольких значений в один параметр сценария PowerShell


у меня есть скрипт, которому я передаю имя(ы) сервера в $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
4 61

4 ответа:

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

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

вместо

foreach ($i in $args)

можно использовать

foreach ($hostName in $Hosts)

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

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

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

Билл

параметры принимают входные данные перед аргументами. Вместо этого вы должны добавить параметр, который принимает массив, и сделать его первым параметром позиции. например:

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

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

тогда назовите это так:

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

обратите внимание на запятую между значениями. Это собирает их в массив

один из способов сделать это было бы так:

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

Это позволит ввести несколько хостов с пробелами.

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

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

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

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

оператор split возвращает массив string