web-dev-qa-db-ja.com

単一の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
76
jcarpio

最も簡単な方法は、おそらく2つのパラメーターを使用することです。1つはホスト用(アレイにすることができます)、もう1つはvlan用です。

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

の代わりに

foreach ($i in $args)

使用できます

foreach ($hostName in $Hosts)

ホストが1つしかない場合、foreachループは1回だけ反復します。複数のホストをスクリプトに渡すには、配列として渡します。

myScript.ps1 -Hosts Host1,Host2,Host3 -VLAN 2

...または同様のもの。

141
Bill_Stewart

パラメーターは引数の前に入力を取ります。代わりに行うべきことは、配列を受け入れるパラメーターを追加し、それを最初の位置パラメーターにすることです。例:

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

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

次に、次のように呼び出します。

.\script.ps1 Host1, Host2, Host3 -VLAN 2

値の間のコンマに注意してください。これはそれらを配列に収集します

18
Frode F.

その方法の1つは次のようになります。

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

これにより、複数のホストをスペースで入力できます。

10
Nitz