将多个值传递给单个PowerShell脚本参数

时间:2013-02-27 19:24:10

标签: powershell parameters

我有一个脚本,我在$ 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

3 个答案:

答案 0 :(得分:139)

最简单的方法可能是使用两个参数:一个用于主机(可以是一个数组),另一个用于vlan。

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

而不是

foreach ($i in $args)

你可以使用

foreach ($hostName in $Hosts)

如果只有一个主机,则foreach循环将只迭代一次。要将多个主机传递给脚本,请将其作为数组传递:

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

......或类似的东西。

答案 1 :(得分:17)

参数在参数之前输入。你应该做的是添加一个接受数组的参数,并使其成为第一个位置参数。例如:

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

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

然后称之为:

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

注意值之间的逗号。这将它们收集在一个数组中

答案 2 :(得分:-3)

我调用一个必须以这种方式连接到服务器列表的预定脚本:

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

然后在剧本里面:

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

split运算符返回一个字符串数组