PowerShell中带有括号的环境变量名称,例如%ProgramFiles(x86)%?

36
在 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中正确转义的语法,我就不需要问这个问题了。


也许有用:http://geekswithblogs.net/Lance/archive/2009/12/29/program-files-environment-variable-in-powershell.aspx - Kiquenet
1个回答

58

很简单。将第6行的方括号内的空格删除即可:

$d = "${Env:ProgramFiles(x86)}"      # LINE 6 (NO spaces inside brackets)

你只需要用{}括起来包含()的变量即可。括号内不要有空格。


1
感谢@ravikanth!我在"${ Env:ProgramFiles(x86) }"上失败了,注意它包含空格。我应该意识到这与"${Env:ProgramFiles(x86)}"不同,后者不包含空格。为了清晰起见,我在你的答案中添加了一些额外的文本。 - jwfearn
我删除了与我的帖子相同的额外行。希望你不介意。 - jwfearn
1
再次感谢@ravikanth。对于那些感兴趣的人,更多细节可在此处查看:http://technet.microsoft.com/en-us/library/dd347604.aspx。请参阅标题为包含特殊字符的变量名称的部分。甚至有一个使用${Env:ProgramFiles(x86)}的示例。 - jwfearn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接