当变量以另一个变量作为前缀并且前缀变量未定义为函数的参数时,Powershell错误

时间:2016-09-29 10:46:40

标签: powershell

当变量例如发生以下错误时作为函数的参数传递的varSuffixed以其他变量名称为前缀,例如var,它也传递给函数但未在函数中指定为参数:Cannot bind parameter because parameter 'varSuffixed' is specified more than once.

如果指定了两个参数或者前缀变量是函数中的指定参数,则不会发生错误。不同时展开变量时也会出现错误。

以下是一个例子:

$args = @{
  "var"="blah";
  "varSuffixed"="blah2";
}

function Do-WorkingFunction($var, $varSuffixed){
  Write-Host($var)
  Write-Host($varSuffixed);
}

function Do-BrokenFunction($varSuffixed){
  Write-Host($varSuffixed);
}

Do-WorkingFunction @args
Do-BrokenFunction @args

尝试访问varSuffixed中的变量Do-BrokenFunction时,会出现以下错误:Cannot bind parameter because parameter 'varSuffixed' is specified more than once.

有人可以解释为什么会这样吗?

已经使用PowerShell版本2和5进行了测试。

1 个答案:

答案 0 :(得分:1)

问题是PowerShell中的匹配参数名称是通过部分命名发生的,只要名称是唯一的。您会注意到Do-BrokenFunction -var 3有效,即使Do-BrokenFunction没有名为var的参数。相反,Do-BrokenFunction -var 3 -varSuffixed 4失败了,这正是您在splatting时所做的事情。

除了不这样做之外,还有其他解决方法。确保您的函数包含所有唯一可区分的参数,或仅传递相关参数作为参数(推荐),或让您的函数直接接受哈希表并从中获取值。我想,你可以编写一个相当复杂的元函数,根据函数实际预期的内容过滤哈希表,但在我看来,它比它的价值要大得多。