PowerShell: объединение путей с использованием переменной - PullRequest
14 голосов
/ 13 декабря 2010

Это должно быть что-то очевидное, но я не могу заставить это работать.

Я пытаюсь создать переменную, которая должна содержать путь к существующему файлу, используя переменную среды ($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

Что происходит, и как мне это исправить?

Ответы [ 2 ]

23 голосов
/ 13 декабря 2010

Вот что происходит ...

В любом пути 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.

или это ...

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
1 голос
/ 13 декабря 2010

Это странно и похоже на ошибку. На самом деле это разрешение переменной $env:programfiles и добавление остальной части строки - что в данном случае просто (x86).

Это будет работать, хотя:

$f =  ${env:ProgramFiles(x86)} + '\sometextfile.txt'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...