114

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

5 回答 5

204

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

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

代替

foreach ($i in $args)

您可以使用

foreach ($hostName in $Hosts)

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

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

...或类似的东西。

于 2013-02-27T19:30:23.493 回答
27

一种方法是这样的:

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

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

于 2017-05-12T14:38:00.860 回答
26

参数在参数之前接受输入。您应该做的是添加一个接受数组的参数,并将其设为第一个位置参数。前任:

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

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

然后这样称呼它:

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

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

于 2013-02-27T19:31:09.423 回答
0

我在我的 yml 文件中执行此操作时遇到问题,然后我找到了此链接并将“-Command”添加到我的脚本前面解决了它:

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

于 2022-02-04T13:22:10.577 回答
-7

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

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

然后在脚本内部:

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

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

于 2016-02-12T14:58:11.953 回答