почему блок скриптов, передаваемый в качестве аргумента в список аргументов invoke-commands, терпит неудачу? - PullRequest
6 голосов
/ 24 августа 2011
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 ]

6 голосов
/ 24 августа 2011

Я проверил, что это «известная проблема».В то время как в большинстве случаев при удаленном взаимодействии блоки сценариев регургитируют так же хорошо, как блоки сценариев, но с ArgumentList они этого не делают, поэтому вместо этого я делаю

function Caller($runthis)
{
   $runthis = [Scriptblock]::Create($runthis)
   &$runthis
}
2 голосов
/ 24 августа 2011

Поскольку -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

Я думаю, что блоки скриптов обрабатываются по-разному, поскольку их запуск может считаться проблемой безопасности.

0 голосов
/ 25 августа 2011

Адаптировано к вашему исходному коду, я делаю так:

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

A function не является a scriptblock, a scriptblock является свойством функции.

...