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

Я пишу сценарий PowerShell, который будет выполнять команды на удаленном хосте, используя 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, которая является локальной функцией с аргументами?

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

Ответы [ 3 ]

45 голосов
/ 09 декабря 2011

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

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

$x = "abc"
$y= 123

Invoke-Command -Credential $c -ComputerName $fqdn -ScriptBlock ${function:Foo} -ArgumentList $x,$y
7 голосов
/ 09 декабря 2011

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

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

$a.invoke() // Locally

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

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

2 голосов
/ 10 апреля 2012

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

function foo
{
    param([string]$hosts, [string]$commands)
    $scriptblock = $executioncontext.invokecommand.NewScriptBlock($commands)
    $hosts.split(",") |% { Invoke-Command -Credential $cred -ComputerName $_.trim() -Scriptblock $scriptblock }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...