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