Invoke-Command调用带数组参数的本地函数时的通用参数传递方法问询
Invoke-Command调用带数组参数的本地函数时的通用参数传递方法问询
我在PowerShell的.ps1脚本里写了一个接受字符串数组参数的函数,想通过远程调用的方式在另一台服务器上执行它(不想依赖目标服务器上有这个函数的副本)。我查过相关资料,但发现现有的方法要么只适用于非数组参数,要么在数组参数不是最后一个时才生效,遇到了奇怪的问题:
先看我的函数定义:
function Hello_Worlds { param([string[]]$persons) foreach($person in $persons){ write-host ("hello "+$person) } }
我定义了一个数组变量$people = "bob","joe",然后尝试远程调用:
# 执行后只输出 "hello bob",第二个元素joe没被处理 Invoke-Command -ComputerName "s1" -ScriptBlock ${function:Hello_Worlds} -ArgumentList $people
后来我试了在参数列表后面加个空字符串,居然正常输出了:
# 这次能正常输出 "hello bob hello joe" Invoke-Command -ComputerName "s1" -ScriptBlock ${function:Hello_Worlds} -ArgumentList $people, ""
这种加空参数的方式虽然能解决问题,但感觉是个不太规范的 workaround,我肯定是漏掉了什么简单正确的方法。
补充说明:
我之前看到过针对单个数组参数的处理方案,但那个方法要求我必须提前知道哪个参数是数组才行。我想要一个通用的处理方式:比如我有一个自定义生成的参数列表$myCustomGeneratedArguments,里面可能有0个或多个参数,而且其中任意数量的参数都可能是数组。有没有办法统一处理这种情况,不用每次调用前都写这样的判断逻辑?
我自己临时写了一段判断代码,但不确定这是不是最优解:
foreach($parg in $myCustomGeneratedArguments) { if($parg -is [array]) { $paramArgs += ,$parg } else { $paramArgs += $parg } }
备注:内容来源于stack exchange,提问作者casewolf
相关产品推荐
相关产品推荐

