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
答案 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
不是 scriptblock
,scriptblock
是函数的属性。