在PowerShell脚本中,如何获取名称中包含括号的环境变量的值?
更复杂的是,一些变量的名称包含括号,而其他变量的名称没有括号。例如(使用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)
我们发现%ProgramFiles%
与%ProgramFiles(x86)%
不同。
我的PowerShell代码以一种奇怪的方式失败,因为它忽略了圆括号后的环境变量名称部分。由于这恰好匹配不同的名称,但现有的环境变量我没有失败,我只是得到了错误变量的正确值。
这是PowerShell脚本语言中的一个测试函数,用于说明我的问题:
function Do-Test
{
$ok = "C:\Program Files (x86)" # note space between 's' and '('
$bad = "$Env:ProgramFiles" + "(x86)" # uses %ProgramFiles%
$d = "${ Env:ProgramFiles(x86) }" # fail (2), LINE 6
# $d = "$Env:ProgramFiles(x86)" # fail (1)
if ( $d -eq $ok ) {
Write-Output "Pass"
} elseif ( $d -eq $bad ) {
Write-Output "Fail: (1) %ProgramFiles% used instead of %ProgramFiles(x86)%"
} else {
Write-Output "Fail: (2) some other reason"
}
}
这是输出:
PS> Do-Test
Fail: (2) some other reason
我可以对上面的第6行进行简单的更改,以获得%ProgramFiles(x86)%的正确值吗?
注意:在这篇文章的文本中,我使用环境变量的批处理文件语法作为方便的简写。例如,%SOME_VARIABLE%表示“名称为SOME_VARIABLE的环境变量的值”。如果我在PowerShell中知道正确转义的语法,我就不需要问这个问题了。
答案 0 :(得分:54)
简单。更改第6行以删除括号内的空格:
$d = "${Env:ProgramFiles(x86)}" # LINE 6 (NO spaces inside brackets)
您只需将包含()的变量包装为{}。括号内没有空格。