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.