2017-02-09 176 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