【问题标题】:Environment variable names with parentheses, like %ProgramFiles(x86)%, in PowerShell?PowerShell 中带括号的环境变量名称,如 %ProgramFiles(x86)%?
【发布时间】: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


【解决方案1】:

简单。更改第 6 行以删除括号内的空格:

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

您只需将包含 () 的变量用 {} 包装起来。括号内没有空格。

【讨论】:

  • 谢谢@ravikanth!我使用“${ Env:ProgramFiles(x86) }”失败了,请注意它包含空格。我应该意识到这与“${Env:ProgramFiles(x86)}”不同,不包含空格。为了清楚起见,我在您的答案中添加了一些额外的文字。
  • 我删除了与我的帖子中相同的多余行。希望你不要介意。
  • 再次感谢@ravikanth。对于那些感兴趣的人,更多详情请访问:technet.microsoft.com/en-us/library/dd347604.aspx。请参阅标题为包含特殊字符的变量名称的部分。甚至还有一个使用 ${Env:ProgramFiles(x86)} 的示例。
猜你喜欢
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 2010-09-23
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多