2011-01-11 14 views
31

En un script de PowerShell, ¿cómo se obtiene el valor de una variable de entorno cuyo nombre contiene paréntesis?Nombres de variables de entorno con paréntesis, como% ProgramFiles (x86)%, en PowerShell?

Para complicar las cosas, los nombres de algunas variables contienen paréntesis, mientras que otros tienen nombres similares sin paréntesis. Por ejemplo (usando 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) 

Vemos que %ProgramFiles% no es lo mismo que %ProgramFiles(x86)%.

Mi código de PowerShell está fallando de una manera extraña porque está ignorando la parte del nombre de la variable de entorno después de los paréntesis. Dado que esto coincide con el nombre de diferente, pero la variable de entorno existente no falla, obtengo el valor correcto de la variable incorrecta.

Aquí es una función de prueba en el idioma PowerShell secuencias de comandos para ilustrar mi problema:

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

Y aquí está la salida:

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

¿Hay un simple cambio que puedo hacer a la línea 6 de arriba para obtener el valor correcto de% ProgramFiles (x86)%?

NOTA: En el texto de esta publicación utilizo la sintaxis del archivo por lotes para variables de entorno como una abreviatura conveniente. Por ejemplo% SOME_VARIABLE% significa "el valor de la variable de entorno cuyo nombre es SOME_VARIABLE". Si supiera la sintaxis escapada correctamente en PowerShell, no necesitaría hacer esta pregunta.

+0

Quizás útil: http://geekswithblogs.net/Lance/archive/2009/12/29/program-files-environment-variable-in-powershell.aspx – Kiquenet

Respuesta

50

Simple. Cambiar la línea 6 para eliminar los espacios dentro de los corchetes:

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

Sólo hay que ajustar la variable que contiene() con {}. Sin espacios dentro de los corchetes.

+1

Gracias @ravikanth! Fallé con "$ {Env: ProgramFiles (x86)}", tenga en cuenta que contiene espacios. Debería haberme dado cuenta de que esto difiere de "$ {Env: ProgramFiles (x86)}", NO contiene espacios. Agregué texto adicional a tu respuesta para mayor claridad. – jwfearn

+0

Eliminé líneas adicionales que son las mismas que en mi publicación. Espero que no te moleste. – jwfearn

+0

Sí, gracias por la actualización :) – ravikanth

Cuestiones relacionadas