powershellpowershell-workflow

How to define named parameter as [ref] in PowerShell


I'm trying to use [ref] named parameters. However, I am getting an error:

workflow Test
{
    Param([Parameter(Mandatory=$true)][String][ref]$someString)

    write-verbose $someString -Verbose
    $someString = "this is the new string"
}

cls
$someString = "hi"
Test -someString [ref]$someString
write-host $someString

#Error: Cannot process argument transformation on parameter 'someString'. Reference type is expected in argument.

How can I fix this problem?


Solution

  • I noticed that you are using a "workflow" in your example of a [ref] parameter. For simplicity, let's call it a "function" and get back to "workflow" later.

    There are three things you need to change in your code:

    1. When passing a [ref] parameter to function, you need to enclose the parameter in parenthesis ().
    2. When using a [ref] parameter within a function refer to $variable.value
    3. Remove [string] type from your parameter definition. It can be a [string], or [ref], but not both.

    Here is code that works:

    function Test
    {
        Param([Parameter(Mandatory=$true)][ref]$someString)
    
        write-verbose $someString.value -Verbose
        $someString.value = "this is the new string"
    }
    cls
    $someString = "hi"
    Test -someString ([ref]$someString)
    write-host $someString
    

    As for "workflows". They are very restricted, read PowerShell Workflows: Restrictions. In particular you can't invoke a method on an object within workflow. This will break the line:

    $someString.value = "this is the new string"
    

    I don't think that using [ref] parameters in a workflow is practical, because of workflow restrictions.