PowerShell:使用变量组合路径

PowerShell:使用变量组合路径,powershell,Powershell,这肯定是件很明显的事,但我没法让它起作用 我正在尝试使用环境变量($env:programfiles(x86))构建一个应包含现有文件路径的变量。然而,我不断地犯错误,我不明白为什么 这可以正常工作(如果文件存在): 然而,这并不是: PS C:\> "$env:programfiles(x86)" C:\Program Files(x86) PS C:\> $f = "$env:ProgramFiles(x86)" + '\sometextfile.txt' PS C:\>

这肯定是件很明显的事,但我没法让它起作用

我正在尝试使用环境变量(
$env:programfiles(x86)
)构建一个应包含现有文件路径的变量。然而,我不断地犯错误,我不明白为什么

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

然而,这并不是:

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
PS C:\>“$env:programfiles(x86)”
C:\程序文件(x86)
PS C:\>$f=“$env:ProgramFiles(x86)”+'\sometextfile.txt”
私人秘书长:\>$f
C:\ProgramFiles(x86)\sometextfile.txt
PS C:\>gci$f
Get-ChildItem:找不到路径“C:\Program Files(x86)\sometextfile.txt”,因为它不存在。
第1行字符数:4

+gci这很奇怪,看起来像个虫子。实际上,它正在解析
$env:programfiles
变量,并附加字符串的其余部分——在本例中正好是(x86)

但这将起作用:

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

下面是正在发生的事情

在任何Windows PowerShell路径中,空字符或空格都需要用一组引号或括号括起来。
C:\Program Files(x86)
的PowerShell环境变量是
${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.
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

第二个例子中缺少的空格只是一个打字错误吗?“程序文件(x86)”vs“程序文件(x86)”不是,我也没有空间。非常奇怪不,在64位系统上有两个env变量:${env:programfiles}和${env:programfiles(x86)}可能有用:根据前面的海报,这不是一个bug。在Powershell语法中,括号表示传递给cmdlet或脚本的参数。由于环境变量存储的路径中有一组括号,因此需要在${}之间对该变量进行转义和求值。要了解我的意思,请尝试创建一个带有括号的变量,例如$dogs(areawesome)或$programs(x64),您将在表达式或语句中获得一个“意外标记”()。Powershell编码器可以通过创建环境变量“$env:ProgramFilesx86”来避免此问题。您的答案是正确的,但原因不是。结果路径中的空格与此特定envvar需要
{}
的原因无关。如果需要,则
$env:ProgramFiles
也需要
{}
,但它不需要。原因是ProgramFiles(x86)行为不当纯粹是解析器的问题。当解析器计算
$env:ProgramFiles(x86)
时,当它看到在当前上下文中无效的开头参数时,会看到一个新的“Group”表达式。您可以通过PowerShell标记器看到这一点,例如:
[management.automation.psparser]::标记化(“$env:ProgramFiles(x86)”,[ref]$errors)
。PowerShell开发人员没有命名该环境变量。:P
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