2016-09-29 88 views
0

当变量(例如,作为函数参数传递的varSuffixed以其他变量名作为前缀,例如, var,它也传递给该函数,但未在该函数内指定为参数:Cannot bind parameter because parameter 'varSuffixed' is specified more than once.Powershell错误,当变量带有其他变量前缀时,前缀变量未定义为函数的参数

如果指定了两个参数或者前缀变量是函数中的指定参数,则不会发生该错误。当不溅射变量时也会发生错误。

下面是一个例子:

$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 

当试图访问变量varSuffixedDo-BrokenFunction,出现以下错误:Cannot bind parameter because parameter 'varSuffixed' is specified more than once.

任何人能解释这是为什么?

这已经过测试与2 PowerShell的版本和5

回答

1

的问题是,在PowerShell中匹配的参数名称由局部命名发生,只要名称是独一无二的。您会注意到Do-BrokenFunction -var 3可以工作,即使Do-BrokenFunction没有名为var的参数。相反,Do-BrokenFunction -var 3 -varSuffixed 4失败,而这正是溅射时你所做的。

除此之外,没有任何其他的解决方法。要么确保你的函数所使用的参数都是唯一可区分的,或者只将相关参数作为参数传递(推荐),或让你的函数直接接受一个哈希表,并从那里采集值。我想,你可以写一个相当复杂的元函数,它根据函数实际期望的过滤哈希表,但在我看来,这比它的价值更麻烦。