2013-02-27 138 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 
    ) ... 

这将允许多个主机输入空格。

相关问题