Ответ 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
Я пишу 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
, которая является локальной функцией с аргументами?
Я понимаю, что я могу обернуть всю функцию и параметры в большом блоке кода, но, по-моему, это не чистый способ сделать это.
Я думаю, вы хотите:
function Foo ( $a,$b) {
$a
$b
return "foo"
}
$x = "abc"
$y= 123
Invoke-Command -Credential $c -ComputerName $fqdn -ScriptBlock ${function:Foo} -ArgumentList $x,$y
Вы можете обернуть функции в блок и передать блок;
$a = {
function foo{}
foo($args)
}
$a.invoke() // Locally
$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock $a //remotely
Это вряд ли элегантно, хотя.
Это также работает:
function foo
{
param([string]$hosts, [string]$commands)
$scriptblock = $executioncontext.invokecommand.NewScriptBlock($commands)
$hosts.split(",") |% { Invoke-Command -Credential $cred -ComputerName $_.trim() -Scriptblock $scriptblock }
}