Имена переменных среды в скобках, например% ProgramFiles (x86)%, в PowerShell?

Как в сценарии 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, мне бы не пришлось задавать этот вопрос.


person jwfearn    schedule 11.01.2011    source источник
comment
Может быть полезно: geekswithblogs.net / Lance / archive / 29.12.2009 /   -  person Kiquenet    schedule 03.04.2013


Ответы (1)


Простой. Измените строку 6, чтобы удалить пробелы внутри скобок:

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

Вам просто нужно заключить переменную, содержащую (), в {}. В скобках нет пробелов.

person ravikanth    schedule 11.01.2011
comment
Спасибо @ravikanth! Я потерпел неудачу с $ {Env: ProgramFiles (x86)}, обратите внимание, что он содержит пробелы. Я должен был понимать, что это отличается от $ {Env: ProgramFiles (x86)}, НЕ содержащего пробелов. Для ясности я добавил к вашему ответу дополнительный текст. - person jwfearn; 11.01.2011
comment
Я удалил лишние строки, такие же, как в моем сообщении. Надеюсь, ты не против. - person jwfearn; 11.01.2011
comment
Еще раз спасибо @ravikanth. Для заинтересованных, более подробная информация доступна по адресу: technet.microsoft.com/en-us /library/dd347604.aspx. См. Раздел ПЕРЕМЕННЫЕ ИМЕНА, ВКЛЮЧАЮЩИЕ СПЕЦИАЛЬНЫЕ СИМВОЛЫ. Есть даже пример с использованием $ {Env: ProgramFiles (x86)}. - person jwfearn; 10.05.2014