2010-12-13 39 views
13

Điều này phải rõ ràng, nhưng tôi không thể làm việc này.powershell: kết hợp đường dẫn sử dụng biến số

Tôi đang cố tạo một biến chứa đường dẫn đến tệp hiện có, sử dụng biến môi trường ($ env: programfiles (x86)). Tuy nhiên tôi vẫn gặp lỗi, và tôi không hiểu tại sao.

này hoạt động tốt (nếu tập tin tồn tại):

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

Tuy nhiên, đây không:

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 

gì đang xảy ra, và làm thế nào để sửa chữa nó?

+1

Mất không gian trong ví dụ thứ hai chỉ là lỗi đánh máy? "Program Files (x86)" vs "Program Files (x86)" – craika

+0

nó không phải, tôi nhận được nó mà không có không gian quá. rất lạ – CharlesB

+2

không, trên hệ thống 64 bit bạn nhận được hai biến env: $ {env: programfiles} và $ {env: programfiles (x86)} – jeroenh

Trả lời

20

Đây là những gì đang xảy ra ...

Trong bất kỳ ký tự trống con đường Windows Powershell hoặc các không gian cần phải được bao quanh với một tập hợp các dấu ngoặc kép hoặc dấu ngoặc đơn. Biến môi trường Powershell cho C: \ Program Files (x86) là ${env:ProgramFiles(x86)} không $env:ProgamFiles(x86) vì Powershell cần phải thoát khỏi không gian trống trong đường dẫn thực.

Nếu bạn sử dụng biến môi trường rõ ràng '$ {env: ProgramFiles (x86)}', nó hoạt động hoàn hảo.


này sẽ không làm việc ...

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. 

hay này ....

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 

Nhưng công trình này rất lớn ....

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 

Hy vọng điều này sẽ hữu ích!

~ Dan

+5

Mỗi poster trước, đây không phải là lỗi. Trong cú pháp Powershell, các dấu ngoặc đơn chỉ ra một tham số được chuyển đến một lệnh hoặc tập lệnh. Vì biến môi trường lưu trữ một đường dẫn có một tập hợp dấu ngoặc đơn trong đó, biến cần phải được thoát và được đánh giá ở giữa $ {}. Để hiểu ý tôi, hãy thử tạo một biến với dấu ngoặc đơn trong đó, ví dụ $ dogs (areawesome) hoặc $ programs (x64) và bạn sẽ nhận được một 'token bất ngờ' ('trong biểu thức hoặc câu lệnh. vấn đề này bằng cách tạo biến môi trường "$ env: ProgramFilesx86". – thoughtpunch

+0

giải thích tuyệt vời, cảm ơn – jeroenh

+4

Câu trả lời của bạn là chính xác nhưng lý do không phải là. Một không gian trong đường dẫn kết quả không liên quan gì đến lý do tại sao đặc biệt này yêu cầu '{}'. Nếu nó đã làm, sau đó '$ env: ProgramFiles' cũng sẽ yêu cầu' {} 'nhưng nó không. Lý do ProgramFiles (x86) misbehaves hoàn toàn là một vấn đề phân tích cú pháp. Khi trình phân tích cú pháp đánh giá '$ env: ProgramFiles (x86)', nó thấy một biểu thức 'Nhóm' mới khi nó thấy các dấu ngoặc mở đầu tiên không hợp lệ cho ngữ cảnh hiện tại. Bạn có thể thấy điều này với trình mã thông báo PowerShell, ví dụ: '[management.automation.psparser] :: Tokenize ('$ env: ProgramFiles (x86)', [ref] $ errors)'. –

1

Điều đó thật kỳ lạ. Trông giống như một con bọ. Những gì nó thực sự làm mặc dù là giải quyết biến $ env: programfiles và gắn thêm phần còn lại của chuỗi - mà trong trường hợp này chỉ xảy ra là (x86).

này sẽ làm việc mặc dù:

$f = ${env:ProgramFiles(x86)} + '\sometextfile.txt' 
Các vấn đề liên quan