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

时间:2011-01-11 01:51:27

标签: powershell environment-variables escaping

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

1 个答案:

答案 0 :(得分:54)

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

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

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