web-dev-qa-db-fra.com

Noms de variables d'environnement avec des parenthèses, comme% ProgramFiles (x86)%, dans PowerShell?

Dans un script PowerShell, comment obtient-on la valeur d'une variable d'environnement dont le nom contient des parenthèses?

Pour compliquer les choses, le nom de certaines variables contient des parenthèses tandis que d'autres ont des noms similaires sans parenthèses. Par exemple (en utilisant 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)

Nous voyons que %ProgramFiles% N'est pas la même chose que %ProgramFiles(x86)%.

Mon code PowerShell échoue de manière étrange, car il ignore la partie du nom de la variable d'environnement après les parenthèses. Étant donné que cela correspond au nom d'un différent, mais que la variable d'environnement existante ne m'échoue pas, j'obtiens simplement la bonne valeur de la mauvaise variable.

Voici une fonction de test dans le langage de script PowerShell pour illustrer mon problème:

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"
   }
}

Et voici la sortie:

PS> Do-Test
Fail: (2) some other reason

Y a-t-il une modification simple que je peux apporter à la ligne 6 ci-dessus pour obtenir la valeur correcte de% ProgramFiles (x86)%?

REMARQUE: dans le texte de cet article, j'utilise la syntaxe des fichiers batch pour les variables d'environnement comme raccourci pratique. Par exemple% SOME_VARIABLE% signifie "la valeur de la variable d'environnement dont le nom est SOME_VARIABLE". Si je connaissais bien échappé à la syntaxe dans PowerShell, je n'aurais pas besoin de poser cette question.

35
jwfearn

Facile. Modifiez la ligne 6 pour supprimer les espaces à l'intérieur des crochets:

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

Vous n'avez qu'à encapsuler la variable qui contient () avec {}. Aucun espace à l'intérieur des supports.

55
ravikanth