Подтвердить что ты не робот

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

У меня есть script, с которым я передаю имя сервера в $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, но если вы этого не сделаете, то script auto назначит последнему имени сервера $vlan.

Итак, как вы можете передать один или несколько параметров плюс необязательный именованный параметр в PowerShell script?

В идеале, здесь приведены примеры:

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

Ответ 1

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

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

Вместо

foreach ($i in $args)

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

foreach ($hostName in $Hosts)

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

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

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

Билл

Ответ 2

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

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

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

Затем назовите его так:

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

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

Ответ 3

Один из способов сделать это будет следующим:

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

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

Ответ 4

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

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

Затем внутри script:

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

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