2013-02-27 139 views
40

我有一個腳本,我在$ args中傳遞服務器名稱。將多個值傳遞給單個PowerShell腳本參數

這樣我可以做的東西使用foreach這個(這些)服務器(S):

.\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 

回答

84

最簡單的方法可能是使用兩個參數:一個用於主機(可以是一個數組),以及一個用於VLAN。

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

而不是

foreach ($i in $args) 

可以使用

foreach ($hostName in $Hosts) 

如果只有一個主機,foreach循環將遍歷一次。要將多個主機傳遞給腳本,請將其作爲數組傳遞:

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

...或類似的東西。

Bill

+0

感謝您提供關於如何調用腳本的信息 - 我經常會在PowerShell中忽略那些小碎片。 – 2018-02-21 16:00:33

14

參數在參數前加上輸入。你應該做的是添加一個接受數組的參數,並使其成爲第一個位置參數。例如:

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

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

然後調用它像:

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

通知的值之間的逗號。這個收集在一個陣列

0

我打電話預定腳本誰必須這樣連接到服務器的列表:

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

然後裏面的腳本:

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

拆分操作返回字符串排列

1

其中一種方法是這樣的:

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

這將允許多個主機輸入空格。

相關問題