“无法绑定参数,因为Param2被多次指定”

时间:2016-10-04 19:10:41

标签: powershell batch-file parameters parameter-passing

我试图通过批处理文件调用PS脚本,如此

Powershell.exe -file "C:\Scripts\Blah\Blah\Blah.ps1" -webUID "usernameValue" -webPWD "passwordValue" -Param "param value" -Param2 "param 2 value"

问题似乎是批处理文件让Param和Param2感到困惑。它认为我正在设置Param2 两次但是Param和Param2完全是单独的参数。有没有人经历过这个?有没有办法明确说明参数名称?感谢

Param block

# Parameters
Param
(
  [string]$WebUID,
  [string]$WebPWD,
  [string]$Param,
  [string]$Param2
)

2 个答案:

答案 0 :(得分:2)

为了支持简洁的命令行使用,PowerShell的“弹性语法”允许指定参数名称的明确前缀子串,这样您只需要输入尽可能多的参数名称识别它没有歧义;
例如,如果没有其他参数以-p开头,则输入-Path来引用p就足够了。

但是,始终会识别完全匹配,因此在您的案例中指定-Param应该明确地匹配-Param参数,即使它的全名恰好是不同参数-Param2的前缀子字符串。

如果问题 是歧义问题(事实并非如此),您会看到不同的错误消息。例如,如果你使用含糊不清的-Para,你会看到:
Parameter cannot be processed because the parameter name 'para' is ambiguous. Possible matches include: -Param -Param2.

相反, 您的错误消息的措辞表明完全相同的参数名称 - -Param2 - 确实已经多次指定 - 即使您的示例代码没有显示。

我已经测试了PSv2和PSv5.1 / 6.0 alpha 10中的行为 - 然而,可以想象其他版本由于错误而采取不同的行为。请告诉我们。

考虑替代方法

如果您从PowerShell 中的调用了脚本,则可以使用单个数组值参数 - 例如[string[]] $Params - 然后根据需要传递尽可能多的参数,以逗号分隔,而无需为每个值指定不同的参数名称。

可悲的是,从PowerShell 之外的调用脚本时,这种方法不起作用,因为外部不支持传递数组。

但是有一个解决方法

  • 声明用[parameter(ValueFromRemainingArguments=$true)]

  • 修饰的数组值参数
  • 使用参数作为空格分隔列表在命令的末尾调用脚本。

应用于您的场景:

如果您的脚本按如下方式定义其参数:

Param
(
  [string]$WebUID,
  [string]$WebPWD,
  [parameter(ValueFromRemainingArguments=$true)]
  [string[]] $Params
)

然后您可以按如下方式调用脚本:

Powershell.exe -file "C:\Scripts\Blah\Blah\Blah.ps1" `
  -webUID "usernameValue" `
  -webPWD "passwordValue" `
  "param value" "param 2 value"

$Params会收到值数组$Params[0]会收到param value$Params[1]会收到param 2 value

请注意,从PowerShell的外部进行调用时:

  • 一定不能在调用中使用参数名-Params - 只需在结尾指定
  • 不得使用,分隔值 - 使用空格

答案 1 :(得分:0)

我不是大师,但这看起来与"部分参数"相关。和"参数完成"。 See this article for more information

只需将Param更改为Param1即可解决问题。