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.

26
demandé sur Peter Mortensen 2011-12-09 20:46:19

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
42
répondu manojlds 2011-12-09 17:17:51

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.

7
répondu reconbot 2011-12-09 17:10:31

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 }
}
2
répondu prophesional 2012-10-15 12:49:29