PowerShell:使用变量组合路径

jer*_*enh 14 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:\>
Run Code Online (Sandbox Code Playgroud)

但是,这不是:

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
Run Code Online (Sandbox Code Playgroud)

发生了什么,我该如何解决?

tho*_*nch 23

这是发生了什么......

在任何Windows PowerShell路径中,空字符或空格都需要用一组引号或括号括起来.PowerShell环境变量C:\Program Files (x86)${env:ProgramFiles(x86)},$env:ProgamFiles(x86)因为PowerShell需要转义真实路径中的空白空间.

如果您使用'$ {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.
Run Code Online (Sandbox Code Playgroud)

或这个...

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
Run Code Online (Sandbox Code Playgroud)

但这很有效......

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
Run Code Online (Sandbox Code Playgroud)

  • 根据上一张海报,这不是一个错误.在Powershell语法中,括号表示传递给cmdlet或脚本的参数.由于环境变量存储路径中有一组括号,因此需要在$ {}之间转义和计算变量.要了解我的意思,尝试使用括号中的变量,例如$ dogs(areawesome)或$ programs(x64),你将得到一个'意外的令牌'('表达式或声明.Powershell程序员可以避免通过使环境变量"$ env:ProgramFilesx86"来解决这个问题. (5认同)
  • 你的答案是正确的,但原因不是.结果路径中的空格与此特定envvar为什么需要`{}`无关.如果确实如此,那么`$ env:ProgramFiles`也需要`{}`,但事实并非如此.ProgramFiles(x86)行为不端的原因纯粹是解析器问题.当解析器评估`$ env:ProgramFiles(x86)`时,它会看到一个新的'Group'表达式,当它看到在给定当前上下文时无效的开放parens.您可以使用PowerShell tokenizer来看到这一点,例如:`[management.automation.psparser] :: Tokenize('$ env:ProgramFiles(x86)',[ref] $ errors)`. (5认同)