6
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
4

3 回答 3

6

我证实这是一个“已知问题”。虽然在大多数情况下,在远程处理脚本块中反刍就像脚本块一样好,但ArgumentList它们不会,所以我这样做了

function Caller($runthis)
{
   $runthis = [Scriptblock]::Create($runthis)
   &$runthis
}
于 2011-08-24T19:37:34.307 回答
2

由于-ArgumentListtake in 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

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

于 2011-08-24T19:34:51.653 回答
0

适应您的初始代码,我这样做:

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

Afunction 不是a scriptblock, ascriptblock 函数的属性。

于 2011-08-25T05:23:59.987 回答