web-dev-qa-db-ja.com

PowerShellで%ProgramFiles(x86)%のように、括弧で囲まれた環境変数名?

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コードが奇妙な方法で失敗しています。これはたまたまdifferentの名前と一致しますが、既存の環境変数は失敗しないので、間違った変数の正しい値を取得します。

これは、私の問題を説明するための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で構文をエスケープした場合、この質問をする必要はありません。

35
jwfearn

シンプル。行6を変更して、角かっこ内のスペースを削除します。

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

()を含む変数を{}でラップするだけです。括弧内にスペースはありません。

55
ravikanth