当变量例如发生以下错误时作为函数的参数传递的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进行了测试。
答案 0 :(得分:1)
问题是PowerShell中的匹配参数名称是通过部分命名发生的,只要名称是唯一的。您会注意到Do-BrokenFunction -var 3
有效,即使Do-BrokenFunction
没有名为var
的参数。相反,Do-BrokenFunction -var 3 -varSuffixed 4
失败了,这正是您在splatting时所做的事情。
除了不这样做之外,还有其他解决方法。确保您的函数包含所有唯一可区分的参数,或仅传递相关参数作为参数(推荐),或让您的函数直接接受哈希表并从中获取值。我想,你可以编写一个相当复杂的元函数,根据函数实际预期的内容过滤哈希表,但在我看来,它比它的价值要大得多。