web-dev-qa-db-ja.com

引数を持つ関数でのInvoke-Command -ScriptBlockの使用

Invoke-Command とその-ScriptBlockパラメーターを使用して、リモートホストでコマンドを実行するPowerShellスクリプトを作成しています。例えば、

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'の引数を検証できません。引数がヌルです。 NULL以外の引数を指定して、コマンドを再試行してください。

引数を持つローカル関数である-ScriptBlockでInvoke-Commandを使用するにはどうすればよいですか?

関数とパラメーター全体を大きなコードブロックにラップできることを理解していますが、それはそれを行うためのクリーンな方法ではない、と私は考えています。

28

あなたが欲しいと思う:

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

$x = "abc"
$y= 123

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

関数をブロックでラップして、ブロックを渡すことができます。

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

$a.invoke() // Locally

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

しかし、ほとんどエレガントではありません。

7
reconbot

これも機能します:

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