Utilizzo di Invoke-Command -ScriptBlock su una funzione con argomenti

Sto scrivendo uno script PowerShell che eseguirà i comandi su un host remoto usando Invoke-Command e il suo parametro -ScriptBlock . Per esempio,

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

Funziona bene Quello che mi piacerebbe fare ora è la stessa cosa, ma chiamare una funzione con argomenti locali. Per esempio,

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

Ma questo non funziona:

Invoke-Command: imansible validare l’argomento sul parametro ‘ScriptBlock’. L’argomento è nullo. Fornisci un argomento non nullo e prova di nuovo il comando.

Come posso usare Invoke-Command con un -ScriptBlock che è una funzione locale con argomenti?

Mi rendo conto che posso avvolgere l’intera funzione e i parametri in un grande blocco di codice, ma non è un modo pulito di farlo, secondo me.

Penso che tu voglia:

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

È ansible avvolgere le funzioni in un blocco e passare il blocco;

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

Tuttavia, non è elegante.

Questo funziona anche:

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