【问题标题】:"Cannot bind parameter because Param2 is specified more than once"“无法绑定参数,因为 Param2 被多次指定”
【发布时间】:2017-02-13 01:46:12
【问题描述】:

我正在尝试通过批处理文件调用 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 完全是单独的参数。有没有人经历过这个?有没有办法明确说明参数名称?谢谢

参数块

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

【问题讨论】:

  • 是否可能在参数definition中多次指定?你能告诉我们你的代码,或者至少param()块吗?
  • 我添加到 OP。每个参数只指定一次。但是,当我从批处理调用中删除 Param 时,它可以工作。这就是为什么我认为它会将参数读取为通配符值并将 Param 与 Param2 混淆
  • 如果在Param() 块之前添加[CmdletBinding()],它会改变什么吗?
  • 同样的错误信息:/
  • 我无法在此处使用发布的代码复制它。批处理文件中一定有一些东西弄乱了参数。

标签: powershell batch-file parameters parameter-passing


【解决方案1】:

为了支持简洁的命令行使用,PowerShell 的“弹性语法”允许指定参数名称的明确的前缀子字符串,这样您只需键入尽可能多的参数名称毫不含糊地识别它;
例如,如果没有其他参数以p 开头,输入-p 即可引用-Path

但是,始终可以识别 精确 匹配,因此在您的情况下指定 -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 中调用了您的脚本,您可以使用单个 array-valued 参数 - 例如[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 - 只需在末尾指定
  • 不得使用, 分隔值 - 使用空格

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 它可能,但它不应该是因为部分。你需要一个部分参数是明确的。
    • 有趣。我会阅读这篇文章。感谢回复
    • 改写@briantist 的评论:由于-Param 是一个exact 匹配项,因此没有歧义,PowerShell 识别它——即使参数名称恰好是一个子字符串另一个参数名称(尽管这是一种应避免的做法)。
    猜你喜欢
    • 2018-05-13
    • 1970-01-01
    • 2013-10-30
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2017-03-09
    相关资源
    最近更新 更多