Utilisation D'Invoke-Command-ScriptBlock sur une fonction avec arguments
j'écris un script PowerShell qui exécutera des commandes sur un hôte distant en utilisant Invoke-Command et son paramètre -ScriptBlock
. Par exemple,
function Foo {
...
return "foo"
}
$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock ${function:Foo}
ça marche très bien. Ce que j'aimerais faire maintenant est la même chose, mais appelez une fonction avec des arguments locaux. Par exemple,
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)}
mais cela ne fonctionne pas:
Invoke-Command: ne peut pas valider l'argument sur le paramètre 'ScriptBlock'. L'argument est null. Fournir un argument non null et essayer la commande encore.
comment utiliser la commande Invoke-Command avec un -ScriptBlock
qui est une fonction locale avec des arguments?
je me rends compte que je peux envelopper toute la fonction et les paramètres dans un grand bloc de code, mais ce n'est pas une façon propre de le faire, à mon avis.
3 réponses
je pense que vous voulez:
function Foo ( $a,$b) {
$a
$b
return "foo"
}
$x = "abc"
$y= 123
Invoke-Command -Credential $c -ComputerName $fqdn -ScriptBlock ${function:Foo} -ArgumentList $x,$y
vous pouvez envelopper les fonctions dans un bloc et passer le bloc;
$a = {
function foo{}
foo($args)
}
$a.invoke() // Locally
$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock $a //remotely
ce n'est pas élégant.
cela fonctionne aussi:
function foo
{
param([string]$hosts, [string]$commands)
$scriptblock = $executioncontext.invokecommand.NewScriptBlock($commands)
$hosts.split(",") |% { Invoke-Command -Credential $cred -ComputerName $_.trim() -Scriptblock $scriptblock }
}