2010-12-13 79 views
13

这一定是明显的,但我无法得到这个工作。powershell:结合使用变量的路径

我想使用环境变量($ env:programfiles(x86))来构建一个应该包含现有文件路径的变量。然而,我不断收到错误,我不明白为什么。

这工作正常(如果该文件存在):

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:\> 

然而,这并不:

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 

发生了什么,以及如何解决它?

+1

在第二个例子中缺少的空间只是一个错字吗? “程序文件(x86)”与“程序文件(x86)” – craika 2010-12-13 13:52:23

+0

它不是,我得到它没有太大的空间。非常奇怪 – CharlesB 2010-12-13 14:01:34

+2

不,在64位系统上,你得到两个env变量:$ {env:programfiles}和$ {env:programfiles(x86)} – jeroenh 2010-12-13 15:53:42

回答

20

这是怎么回事...

在任何的Windows PowerShell路径空字符或空格需要用一组引号或括号包围。因为Powershell需要转义真实路径中的空白空间,所以C:\ Program Files(x86)的Powershell环境变量为${env:ProgramFiles(x86)}而不是$env:ProgamFiles(x86)

如果使用'$ {env:ProgramFiles(x86)}'显式环境变量,它可以很好地工作。


这样可不行...

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. 

或这个....

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 

但这个伟大工程....

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 

希望这有助于!

〜Dan

+5

根据之前的海报,这不是一个错误。在Powershell语法中,括号表示传递给cmdlet或脚本的参数。由于环境变量存储的路径中有一组括号,因此需要在$ {}之间转义和计算该变量。为了明白我的意思,试着用一个括号括起来的变量,例如$ dogs(areawesome)或$ programs(x64),你会得到一个'Unexpected token'('表达式或语句中的').PowerShell编码器可以避免通过使环境变量“$ env:ProgramFilesx86”来解决这个问题。 – thoughtpunch 2010-12-13 14:23:21

+0

很好的解释,谢谢 – jeroenh 2010-12-13 15:54:22

+4

你的回答是正确的,但原因不是。结果路径中的空间与为什么这个特定的envvar需要'{}'无关。如果是这样,那么'$ env:ProgramFiles'也需要'{}',但它不会。 ProgramFiles(x86)行为不当的原因纯粹是解析器问题。当解析器评估'$ env:ProgramFiles(x86)'时,当它看到在给定当前上下文时无效的开始参数时,它会看到一个新的“组”表达式。您可以使用PowerShell标记器来查看,例如:'[management.automation.psparser] :: Tokenize('$ env:ProgramFiles(x86)',[ref] $ errors)'。 – 2010-12-13 16:58:01

1

这很奇怪。看起来像一个错误。它实际上做的是解决$ env:programfiles变量并追加字符串的其余部分 - 在这种情况下恰好是(x86)。

这会的工作,虽然:

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