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

jwf*_*arn 35 powershell escaping environment-variables

在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)
Run Code Online (Sandbox Code Playgroud)

我们看到%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"
   }
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

PS> Do-Test
Fail: (2) some other reason
Run Code Online (Sandbox Code Playgroud)

我可以对上面的第6行进行简单的更改,以获得%ProgramFiles(x86)%的正确值吗?

注意:在这篇文章的文本中,我使用环境变量的批处理文件语法作为方便的简写.例如,%SOME_VARIABLE%表示"名称为SOME_VARIABLE的环境变量的值".如果我在PowerShell中知道正确转义的语法,我就不需要问这个问题了.

rav*_*nth 54

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

$d = "${Env:ProgramFiles(x86)}"      # LINE 6 (NO spaces inside brackets)
Run Code Online (Sandbox Code Playgroud)

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