Environment variable names with parentheses, like %ProgramFiles(x86)%, in PowerShell?
- by jwfearn
How does one get the value of environment variable whose name contains parentheses in a PowerShell script?
To complicate matters, some variables names contains parentheses while others have similar names without parenteses. For example (using cmd.exe):
C:\>set | find "ProgramFiles"
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
We see that %ProgramFiles% is not the same as %ProgramFiles(x86)%.
My PowerShell code is failing in a weird way because it's ignoring the part of the environment variable name after the parentheses. Since this happens to match the name of a different, but existing, environment variable I don't fail, I just get the right value of the wrong variable.
Here's a test function in the PowerShell scripting language to illustrate my problem:
function Do-Test
{
$ok = "C:\Program Files (x86)" # note space between 's' and '(
$bad = "$Env:ProgramFiles" + "(x86)" # uses %ProgramFiles%
$bin32 = "$Env:ProgramFiles(x86)" # LINE 6, I want to use %ProgramFiles(x86)%
if ( $bin32 -eq $ok ) {
Write-Output "Pass"
} elseif ( $bin32 -eq $bad ) {
Write-Output "Fail: %ProgramFiles% used instead of %ProgramFiles(x86)%"
} else {
Write-Output "Fail: some other reason"
}
}
And here's the output:
PS> Do-Test
Fail: %ProgramFiles% used instead of %ProgramFiles(x86)%
Is there a simple change I can make to line 6 above to get the correct value of %ProgramFiles(x86)%?
*NOTE: In the text of this post I am using batch file syntax for environment variables as a convenient shorthand. For example %SOME_VARIABLE% means "the value of the environment variable whose name is SOME_VARIABLE". If I knew the properly escaped syntax in PowerShell, I wouldn't need to ask this question.*