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

Posted

技术标签:

【中文标题】PowerShell 中带括号的环境变量名称,如 %ProgramFiles(x86)%?【英文标题】:Environment variable names with parentheses, like %ProgramFiles(x86)%, in PowerShell? 【发布时间】: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 中正确转义的语法,我就不需要问这个问题了。

【问题讨论】:

也许有用:geekswithblogs.net/Lance/archive/2009/12/29/… 【参考方案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) 的示例。

以上是关于PowerShell 中带括号的环境变量名称,如 %ProgramFiles(x86)%?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过环境变量设置名称中带有下划线的 Spring Boot 属性?

如何通过环境变量设置名称中带有下划线的 Spring Boot 属性?

gsutil:无法触摸名称中带有括号的文件

名称属性中带有方括号的输入的 jQuery 选择器

在 Powershell 中,如何通过提供名称作为 $var 来设置环境变量?

bash 中带有变量、大括号和哈希字符的 $0##... 语法是啥意思?