Usar Invoke-Command -ScriptBlock en una función con argumentos

Estoy escribiendo un script de PowerShell que ejecutará comandos en un host remoto utilizando Invoke-Command y su parámetro -ScriptBlock . Por ejemplo,

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

Esto funciona bien Lo que me gustaría hacer ahora es lo mismo, pero llame a una función con argumentos locales. Por ejemplo,

 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)} 

Pero esto no funciona:

Invoke-Command: no se puede validar el argumento sobre el parámetro ‘ScriptBlock’. El argumento es nulo. Proporcione un argumento no nulo y pruebe el comando nuevamente.

¿Cómo puedo usar Invoke-Command con un -ScriptBlock que es una función local con argumentos?

Me doy cuenta de que puedo ajustar toda la función y los parámetros en un gran bloque de código, pero esa no es una forma limpia de hacerlo, en mi opinión.

Creo que quieres:

 function Foo ( $a,$b) { $a $b return "foo" } $x = "abc" $y= 123 Invoke-Command -Credential $c -ComputerName $fqdn -ScriptBlock ${function:Foo} -ArgumentList $x,$y 

Puede envolver las funciones en un bloque y pasar el bloque;

 $a = { function foo{} foo($args) } $a.invoke() // Locally $rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock $a //remotely 

Aunque no es muy elegante.

Esto también funciona:

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