为什么在invoke-commands参数列表中作为参数传递的scriptblock失败?

时间:2011-08-24 19:00:31

标签: powershell powershell-v2.0 powershell-remoting

function test-scriptblock {
1..10 }
function caller ([scriptblock]$runthis) {
& $runthis
}

以下工作正常。

caller -runthis ${function:test-scriptblock}

这不起作用

invoke-command -ComputerName localhost -ScriptBlock ${function:caller} -ArgumentList ${function:test-scriptblock}

Cannot process argument transformation on parameter 'runthis'. Cannot convert the "
1..10 " value of type "System.String" to type "System.Management.Automation.ScriptBlock".
+ CategoryInfo          : InvalidData: (:) [], ParameterBindin...mationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError

3 个答案:

答案 0 :(得分:6)

我确认这是一个“已知问题”。虽然在远程处理脚本块的大多数情况下,脚本块的反刍效果很好,但ArgumentList却没有,所以反而我

function Caller($runthis)
{
   $runthis = [Scriptblock]::Create($runthis)
   &$runthis
}

答案 1 :(得分:2)

由于-ArgumentList接收Object[],我认为它是caller作为字符串接收的。一个解决方法是:

function caller ($runthis) {
$runthis = $executioncontext.InvokeCommand.NewScriptBlock($runthis)
& $runthis
}

请注意,这样的方法有效:

function caller ($runthis) {
$runthis  | kill
}

$p= Get-Process -name notepad
invoke-command -computer localhost -ScriptBlock ${function:caller} -ArgumentList $p

我认为脚本块的处理方式不同,因为仅仅运行它们可能会被视为安全问题。

答案 2 :(得分:0)

根据您的初始代码,我这样做:

caller -runthis (get-item Function:\test-scriptblock).scriptblock

function 不是 scriptblockscriptblock 是函数的属性。