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を使用するにはどうすればよいですか?
関数とパラメーター全体を大きなコードブロックにラップできることを理解していますが、それはそれを行うためのクリーンな方法ではない、と私は考えています。
あなたが欲しいと思う:
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 }
}