2016-09-29 61 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失敗,而這正是濺射時你所做的。

除此之外,沒有任何其他的解決方法。要麼確保你的函數所使用的參數都是唯一可區分的,或者只將相關參數作爲參數傳遞(推薦),或讓你的函數直接接受一個哈希表,並從那裏採集值。我想,你可以寫一個相當複雜的元函數,它根據函數實際期望的過濾哈希表,但在我看來,這比它的價值更麻煩。