【发布时间】:2011-06-06 21:48:57
【问题描述】:
在 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 中正确转义的语法,我就不需要问这个问题了。
【问题讨论】:
标签: powershell environment-variables escaping