Passando vários valores para um único parâmetro de script do PowerShell

96

Eu tenho um script para o qual passo o (s) nome (s) do servidor em $ args.

Desta forma, posso fazer coisas neste (s) servidor (es) usando foreach:

.\script.ps1 host1 host2 host3

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

Eu gostaria de adicionar um parâmetro opcional nomeado chamado vlan. Eu tentei:

Param(
    [string]$vlan
)

foreach ($i in $args)
{
    Write-Host $i
}
Write-Host $vlan

Funciona se você passar um -vlanparâmetro, mas se não passar , o script atribui automaticamente o último nome do servidor $vlan.

Portanto, como você pode passar parâmetros únicos ou múltiplos, além de um parâmetro nomeado opcional, para um script do PowerShell?

Idealmente, aqui estão alguns exemplos válidos:

.\script.ps1 host1
.\script.ps1 host1 host2 host3
.\script.ps1 host1 host2 -vlan office
carpio
fonte

Respostas:

177

A maneira mais fácil é provavelmente usar dois parâmetros: um para hosts (pode ser uma matriz) e outro para vlan.

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

Ao invés de

foreach ($i in $args)

você pode usar

foreach ($hostName in $Hosts)

Se houver apenas um host, o loop foreach iterará apenas uma vez. Para passar vários hosts para o script, passe-o como uma matriz:

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

... ou algo semelhante.

Bill_Stewart
fonte
7
obrigado por incluir as informações sobre como chamar o script - geralmente estou perdendo pequenas peças como essa no PowerShell.
Jan Bühler
23

Os parâmetros recebem entrada antes dos argumentos. Em vez disso, o que você deve fazer é adicionar um parâmetro que aceite uma matriz e torná-lo o primeiro parâmetro de posição. ex:

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

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

Então chame-o assim:

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

Observe a vírgula entre os valores. Isso os coleta em uma matriz

Frode F.
fonte
19

Uma maneira de fazer isso seria assim:

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

Isso permitiria que vários hosts fossem inseridos com espaços.

Nitz
fonte
Muito bom! Exceto que falta um ']' em seu exemplo para fechar o segundo atributo de Parâmetro.
Sebastiaan M
Esta deve ser a melhor resposta.
Дмитро Іванов
-5

Eu chamo um script programado que deve se conectar a uma lista de servidores desta forma:

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

Então, dentro do script:

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

O operador de divisão retorna uma matriz de string

BR1COP
fonte