2017-02-09 149 views
2

運行下面的代碼問題通過參考訪問列表

$list = @(1,2) 
$hash = @{ 
    foo = @{"Param1" = [REF]$list} 
} 

function foo([REF]$Param1){ 
    $TempList = New-Object System.Collections.ArrayList 
    foreach($Entry in $Param1.Value) { 
     $Entry++ 
     [void]$TempList.Add($Entry) 
    } 
    $Param1.Value = $TempList 
} 

foreach($Function in $Hash.keys) { 
    & $Function @($Hash.$Function) 
    #& foo -Param1 ([REF]$list) 
} 
$list 

會給我的錯誤消息

「可以在參數‘參數1’。沒有過程參數變換參考類型在參數的預期。」

如果我將函數調用與註釋掉的函數調用交換,該腳本將起作用。我需要在散列「$ hash」的定義中更改什麼,以便參數類型正確?

背景: 我想用一個配置文件來調用具有任意參數的任意函數。這是有效的,但顯然不允許我處理輸出,因爲我事先不知道函數會返回什麼。所以這個函數需要直接操作主腳本中的列表。我當然可以把這個清單列入全球範圍,但我寧願不要。或者,也許這將是更好的解決方案?

+2

潑灑上不表達工作,並且這'@()'不是潑灑操作者陣列子表達式。 'foreach($ DE $ in $ Hash.GetEnumerator()){$ Params = $ DE.Value; &$ DE.Key @Params}' – PetSerAl

+1

跟隨@ PetSerAl的評論。這裏是對[Array Expression Operator]的引用(http://stackoverflow.com/documentation/powershell/8981/special-operators/27942/array-expression-operator)和[Splatting](http://stackoverflow.com/documentation/powershell/5647/splatting) – TravisEz13

+0

謝謝你們!正在嘗試使用括號讓ps在評估$ Hash。$ Function之前對其進行評估。不知何故,完全忽略了這一點,當然這將成爲一個陣列。 D的時刻:D – whatever

回答

1

通過Per @ PetSerAl的評論,您正在使用數組表達式運算符或@()而不是splatting運算符或@

這是我使用splatting操作符的代碼版本。

$list = @(1,2) 
$hash = @{ 
    foo = @{"Param1" = [REF]$list} 
} 

function foo([REF]$Param1){ 
    $TempList = New-Object System.Collections.ArrayList 
    foreach($Entry in $Param1.Value) { 
     $Entry++ 
     [void]$TempList.Add($Entry) 
    } 
    $Param1.Value = $TempList 
} 

foreach($Function in $Hash.keys) { 
    [HashTable] $params = $Hash.$Function 
    & $Function @params 
} 
$list 

輸出

2 
3