Powershell – Using Invoke-Command -ScriptBlock on a function with arguments

powershellpowershell-2.0

I'm writing a PowerShell script that will execute commands on a remote host using Invoke-Command and its -ScriptBlock parameter. For example,

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

This works fine. What I'd like to do now is the same thing, but call a function with local arguments. For example,

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

But this does not work:

Invoke-Command : Cannot validate argument on parameter 'ScriptBlock'.
The argument is null. Supply a non-null argument and try the command
again.

How can I use Invoke-Command with a -ScriptBlock that is a local function with arguments?

I realize that I can wrap the entire function and the parameters in a big code block, but that is not a clean way of doing it, in my opinion.

Best Answer

I think you want:

function Foo ( $a,$b) {
    $a
    $b
    return "foo"
}

$x = "abc"
$y= 123

Invoke-Command -Credential $c -ComputerName $fqdn -ScriptBlock ${function:Foo} -ArgumentList $x,$y
Related Topic