运行以下代码
$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
会给我错误信息
"无法处理参数' Param1'的参数转换。参数类型在参数中是预期的。"
如果我将函数调用与已注释掉的函数调用交换,则脚本可以正常工作。我在哈希的定义中需要改变什么?#34; $ hash"这样参数类型是否正确?
背景: 我想使用配置文件来调用任意参数的任意函数。这有效,但显然不允许我处理输出,因为我事先无法知道函数将返回什么。因此该函数需要直接操作主脚本中的列表。我当然可以将该列表全局化,但我不愿意。或者这可能是更好的解决方案?
答案 0 :(得分: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