2

i want to use a predefined function on a remote server with ps invoke and i need to send an object as parameter. This code always writes objects first element.

$object = @('a','b','c')

function testA {

    [CmdletBinding()]
    param (
        [Parameter()]
        [System.Object]
        $test
    )

    write-host $test
    
}

Invoke-Command -Session $session -ScriptBlock ${function:testA} -ArgumentList $object

Is there a way to pass function and object to the remote server with Invoke-Command?

Thx.

1 Answer 1

1

If you want to pass the array stored in $object as a single argument and it is the only argument to pass, you need to wrap it in a transient single-element wrapper array when you pass it to -ArgumentList - otherwise, the array elements are passed as individual arguments:

# Alias -Args for -ArgumentList is used for brevity.
Invoke-Command -Session $session -ScriptBlock ${function:testA} -Args (, $object)

, $object uses the unary form of ,, the array constructor operator, to construct a single-element array whose only element is the $object array. -ArgumentList (-Args) then enumerates the elements of this transient array to form the individual arguments, and therefore passes the one and only element - which is the $object array - as-is.

Note that the problem only arises because you want to pass only a single argument; with two or more arguments, use of the binary form of , is needed anyway, which unambiguously makes $object as a whole its own argument; e.g., ... -ArgumentList $object, 'foo'

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.