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

jca*_*pio 88 parameters powershell

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

这样我可以使用以下方法对这个(这些)服务器执行以下操作foreach:

.\script.ps1 host1 host2 host3

foreach ($i in $args)
{
    Do-Stuff $i
}
Run Code Online (Sandbox Code Playgroud)

我想添加一个名为vlan的命名可选参数.我试过了:

Param(
    [string]$vlan
)

foreach ($i in $args)
{
    Write-Host $i
}
Write-Host $vlan
Run Code Online (Sandbox Code Playgroud)

如果您传递-vlan参数,它会起作用,但如果您不传递参数,则脚本会自动将最后一个服务器名称分配给$vlan.

那么,如何将单个或多个参数以及可选的命名参数传递给PowerShell脚本?

理想情况下,这是有效的例子:

.\script.ps1 host1
.\script.ps1 host1 host2 host3
.\script.ps1 host1 host2 -vlan office
Run Code Online (Sandbox Code Playgroud)

Bil*_*art 163

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

param([String[]] $Hosts, [String] $VLAN)
Run Code Online (Sandbox Code Playgroud)

代替

foreach ($i in $args)
Run Code Online (Sandbox Code Playgroud)

您可以使用

foreach ($hostName in $Hosts)
Run Code Online (Sandbox Code Playgroud)

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

myScript.ps1 -Hosts host1,host2,host3 -VLAN 2
Run Code Online (Sandbox Code Playgroud)

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

  • 感谢您提供有关如何调用脚本的信息 - 我常常在powershell中遗漏那些小件. (4认同)
  • 如果您在 powershell 外部执行(例如在 wsl 中),则需要使用 `-Command` 标志并引用该变量。`pwsh -命令 myScript.ps1 -主机“host1、host2、host3”-VLAN 2` (2认同)

Fro*_* F. 22

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

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

foreach ($i in $Hosts)  
{ 
    Do-Stuff $i
}
Run Code Online (Sandbox Code Playgroud)

然后称之为:

.\script.ps1 host1, host2, host3 -VLAN 2
Run Code Online (Sandbox Code Playgroud)

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


小智 16

一种方法是这样的:

 param(
       [Parameter(Position=0)][String]$Vlan,
       [Parameter(ValueFromRemainingArguments=$true)][String[]]$Hosts
    ) ...
Run Code Online (Sandbox Code Playgroud)

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