Search code examples
powershellspecial-charactersdollar-sign

Why does Powershell not process a string correctly which has a dollar sign and a question mark?


In PowerShell, why does this return nothing:

PS > $y = "$prid?api"
PS > echo $y

But these work better:

PS > $y = "$prid\?api"
PS > echo $y
18\?api
PS > $y = "${prid}?api"
PS > echo $y
18?api

Solution

  • Surprisingly, ? can be used in a PowerShell variable name without requiring that the name be enclosed in {...}.

    Therefore, based on the rules of PowerShell's expandable strings (string interpolation inside "..." strings), "$prid?api" looks for a variable with verbatim name prid?api rather than considering the ? to implicitly terminate the preceding identifier.

    That is, you can actually define and reference a variable named prid?api as follows:

    PS> $prid?api = 'hi'; $prid?api
    hi
    

    This surprising permissiveness actually gets in the way of a recently introduced language feature, null-conditional access, introduced in PowerShell (Core) 7.1:

    # v7.1+; note that the {...} around the name is - unexpectedly - *required*.
    ${variableThatMayBeNull}?.Foo()
    

    GitHub issue #14025 advocates for obviating the need to use {...} in this case.