2010-12-13 12 views
13

Esto debe ser algo obvio, pero no puedo hacer que esto funcione.powershell: combina la ruta usando una variable

Estoy intentando construir una variable que debe contener la ruta a un archivo existente, usando una variable de entorno ($ env: programfiles (x86)). Sin embargo, sigo recibiendo errores y no veo por qué.

Esto funciona bien (si existe el archivo):

PS C:\> $f = "C:\Program Files (x86)" + '\sometextfile.txt' 
PS C:\> $f 
C:\Program Files (x86)\sometextfile.txt 
PS C:\> gci $f 
    Directory: C:\Program Files (x86) 
Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
-a---  13/12/2010  14:03   0 sometextfile.txt 
PS C:\> 

Sin embargo, esto no es así:

PS C:\> "$env:programfiles(x86)" 
C:\Program Files(x86) 
PS C:\> $f = "$env:ProgramFiles(x86)" + '\sometextfile.txt' 
PS C:\> $f 
C:\Program Files(x86)\sometextfile.txt 
PS C:\> gci $f 
Get-ChildItem : Cannot find path 'C:\Program Files(x86)\sometextfile.txt' because it does not exist. 
At line:1 char:4 
+ gci <<<< $f 
    + CategoryInfo   : ObjectNotFound: (C:\Program Files(x86)\sometextfile.txt:String) [Get-ChildItem], ItemNot 
    FoundException 
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand 

Lo que está pasando, y cómo solucionarlo?

+1

¿El espacio faltante en el segundo ejemplo es solo un error tipográfico? "Archivos de programa (x86)" contra "Archivos de programa (x86)" – craika

+0

no lo es, también lo obtengo sin espacio. muy extraño – CharlesB

+2

no, en un sistema de 64 bits obtienes dos variables env: $ {env: programfiles} y $ {env: programfiles (x86)} – jeroenh

Respuesta

20

Esto es lo que está pasando ...

En cualquier carácter o espacios vacíos ruta de Windows PowerShell tienen que estar rodeado de un conjunto de comillas o corchetes. La variable de entorno Powershell para C: \ Archivos de programa (x86) es ${env:ProgramFiles(x86)}, no $env:ProgamFiles(x86), ya que Powershell necesita escapar de los espacios vacíos en la ruta real.

Si utiliza la variable de entorno explícita '$ {env: ProgramFiles (x86)}', funciona perfectamente.


Esto no funcionará ...

PS C:\> cd "$env:programfiles(x86)" 
Set-Location : Cannot find path 'C:\Program Files(x86)' because it does not e 
At line:1 char:3 
+ cd <<<< "$env:programfiles(x86)" 
+ CategoryInfo   : ObjectNotFound: (C:\(x86):String) 
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell. 

o esto ....

PS C:\> $env:ProgramFiles(x86) 
Unexpected token '(' in expression or statement. 
At line:1 char:19 
+ $env:ProgramFiles(<<<< x86) 
+ CategoryInfo   : ParserError: ((:String) [], Parent 
+ FullyQualifiedErrorId : UnexpectedToken 

Pero esto funciona muy bien ....

PS C:\> ${env:ProgramFiles(x86)} 
C:\Program Files (x86) 
PS C:\> $f = "${env:ProgramFiles(x86)}" + "\sometextfile.txt" 
PS C:\> $f 
C:\Program Files (x86)\sometextfile.txt 
PS C:\> gci $f 
Directory: C:\Program Files (x86) 


Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
-a---  12/13/2010 8:58 AM   0 sometextfile.txt 

Espero que esto ayude!

~ Dan

+5

Según el póster anterior, esto no es un error. En la sintaxis de Powershell, los paréntesis indican un parámetro que se pasa a un cmdlet o script. Dado que la variable de entorno almacena una ruta que tiene un conjunto de paréntesis, la variable debe escaparse y evaluarse entre $ {}. Para ver lo que quiero decir, intente hacer una variable con paréntesis, por ejemplo $ dogs (areawesome) o $ programs (x64) y obtendrá un 'token inesperado' ('en expresión o enunciado. Los codificadores de Powershell podrían haber evitado este problema haciendo que la variable de entorno "$ env: ProgramFilesx86". – thoughtpunch

+0

gran explicación, gracias – jeroenh

+4

Su respuesta es correcta, pero la razón no es. Un espacio en la ruta resultante no tiene nada que ver con por qué este particular envvar requiere '{}'. Si lo hiciera, entonces '$ env: ProgramFiles' también requeriría' {} 'pero no es así. La razón por la cual ProgramFiles (x86) se porta mal es puramente un problema de analizador. A medida que el analizador evalúa '$ env: ProgramFiles (x86)', ve una nueva expresión 'Group' cuando ve los paréntesis de apertura que no son válidos dado el contexto actual. Puede ver esto con el tokenizador de PowerShell, por ejemplo: '[management.automation.psparser] :: Tokenize ('$ env: ProgramFiles (x86)', [ref] $ errors)'. –

1

Eso es raro. Parece un error. Sin embargo, lo que realmente está haciendo es resolver la variable $ env: programfiles y anexar el resto de la cadena, que en este caso es (x86).

Esto funcionará sin embargo:

$f = ${env:ProgramFiles(x86)} + '\sometextfile.txt' 
Cuestiones relacionadas