Подтвердить что ты не робот

Использование Invoke-Command -ScriptBlock для функции с аргументами

Я пишу PowerShell script, который будет выполнять команды на удаленном хосте, используя Invoke-Command и его параметр -ScriptBlock. Например,

function Foo {
    ...
    return "foo"
}
$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock ${function:Foo}

Это прекрасно работает. То, что я хотел бы сделать сейчас, это одно и то же, но вызвать функцию с локальными аргументами. Например,

function Bar {
    param( [String] $a, [Int] $b )
    ...
    return "foo"
}
[String] $x = "abc"
[Int] $y = 123
$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock ${function:Foo($x,$y)}

Но это не работает:

Invoke-Command: не удается проверить аргумент в параметре ScriptBlock. Аргумент равен нулю. Поставьте ненулевой аргумент и попробуйте выполнить команду еще раз.

Как я могу использовать Invoke-Command с -ScriptBlock, которая является локальной функцией с аргументами?

Я понимаю, что я могу обернуть всю функцию и параметры в большом блоке кода, но, по-моему, это не чистый способ сделать это.

4b9b3361

Ответ 1

Я думаю, вы хотите:

function Foo ( $a,$b) {
    $a
    $b
    return "foo"
}

$x = "abc"
$y= 123

Invoke-Command -Credential $c -ComputerName $fqdn -ScriptBlock ${function:Foo} -ArgumentList $x,$y

Ответ 2

Вы можете обернуть функции в блок и передать блок;

$a = {
  function foo{}
  foo($args)
}

$a.invoke() // Locally

$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock $a //remotely

Это вряд ли элегантно, хотя.

Ответ 3

Это также работает:

function foo
{
    param([string]$hosts, [string]$commands)
    $scriptblock = $executioncontext.invokecommand.NewScriptBlock($commands)
    $hosts.split(",") |% { Invoke-Command -Credential $cred -ComputerName $_.trim() -Scriptblock $scriptblock }
}