powershell powershell-v2.0

powershell download file



Usar Invoke-Command-ScriptBlock en una funciĆ³n con argumentos (3)

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

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.


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


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.