単一のPowerShellスクリプトパラメーターに複数の値を渡す


96

$ 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

回答:


177

最も簡単な方法は、おそらく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

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


7
スクリプトの呼び出し方法に関する情報を含めていただきありがとうございます。Powershellでそのような小さな部分が欠けていることがよくあります。
JanBühler2018

23

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

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

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

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

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

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


19

これを行う1つの方法は次のようになります。

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

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


すごくいい!例を除いて、2番目のパラメーター属性を閉じる ']'がありません。
Sebastiaan M

これが最良の答えです。
ДмитроІванов

-5

この方法でサーバーのリストに接続する必要があるスケジュールされたスクリプトを呼び出します。

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

次に、スクリプト内:

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

分割演算子は文字列の配列を返します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.