Passing multiple values to a single PowerShell script parameter

我有一个脚本,我在 $args 中传递服务器名。

This way I can do stuff to this (these) server(s) using 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

So, how can you pass single or multiple parameters plus an optional named parameter to a PowerShell script?

理想情况下,这里有一些有效的例子:

.\script.ps1 host1
.\script.ps1 host1 host2 host3
.\script.ps1 host1 host2 -vlan office
303411 次浏览

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

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

Instead of

foreach ($i in $args)

you can use

foreach ($hostName in $Hosts)

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

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

或者类似的东西。

参数在参数之前接受输入。相反,您应该添加一个接受数组的参数,并将其作为第一个位置参数。例如:

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


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

那就这么说吧:

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

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

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

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

Then inside the script:

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

拆分运算符返回字符串数组

一种方法是这样的:

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

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

我在 yml 文件中遇到了一些问题,然后我发现了这个链接,并在脚本的前面添加了“-Command”,解决了这个问题:

Https://michlstechblog.info/blog/powershell-passing-an-array-to-a-script-at-command-line/