2011-01-11 32 views
31

Trong tập lệnh PowerShell, làm cách nào để có được giá trị của biến môi trường có tên chứa dấu ngoặc đơn?Tên biến môi trường có dấu ngoặc đơn, như% ProgramFiles (x86)%, trong PowerShell?

Để làm phức tạp vấn đề, một số tên biến chứa dấu ngoặc đơn trong khi các biến khác có tên tương tự không có dấu ngoặc đơn. Ví dụ (sử dụng cmd.exe):

C:\>set | find "ProgramFiles" 
CommonProgramFiles=C:\Program Files\Common Files 
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files 
ProgramFiles=C:\Program Files 
ProgramFiles(x86)=C:\Program Files (x86) 

Chúng ta thấy rằng %ProgramFiles% là không giống như %ProgramFiles(x86)%.

Mã PowerShell của tôi bị lỗi theo cách lạ vì nó bỏ qua phần tên biến môi trường sau dấu ngoặc đơn. Vì điều này xảy ra khớp với tên của khác nhau, nhưng biến môi trường hiện tại, tôi không thất bại, tôi chỉ nhận được giá trị đúng của biến sai.

Dưới đây là một chức năng kiểm tra bằng ngôn ngữ PowerShell kịch bản để minh họa cho vấn đề của tôi:

function Do-Test 
{ 
    $ok = "C:\Program Files (x86)"  # note space between 's' and '(' 
    $bad = "$Env:ProgramFiles" + "(x86)" # uses %ProgramFiles% 

    $d = "${ Env:ProgramFiles(x86) }" # fail (2), LINE 6 
# $d = "$Env:ProgramFiles(x86)"  # fail (1) 

    if ($d -eq $ok) { 
     Write-Output "Pass" 
    } elseif ($d -eq $bad) { 
     Write-Output "Fail: (1) %ProgramFiles% used instead of %ProgramFiles(x86)%" 
    } else { 
     Write-Output "Fail: (2) some other reason" 
    } 
} 

Và đây là kết quả:

PS> Do-Test 
Fail: (2) some other reason 

Có một sự thay đổi đơn giản tôi có thể làm để dòng 6 trên để nhận được giá trị chính xác của% ProgramFiles (x86)%?

LƯU Ý: Trong văn bản của bài đăng này, tôi đang sử dụng cú pháp tệp lô cho các biến môi trường dưới dạng viết tắt thuận tiện. Ví dụ% SOME_VARIABLE% có nghĩa là "giá trị của biến môi trường có tên là SOME_VARIABLE". Nếu tôi biết cú pháp thoát đúng trong PowerShell, tôi sẽ không cần đặt câu hỏi này.

+0

Có thể hữu ích: http://geekswithblogs.net/Lance/archive/2009/12/29/program-files-environment-variable-in-powershell.aspx – Kiquenet

Trả lời

50

Đơn giản. Thay đổi dòng 6 để xóa dấu cách bên trong dấu ngoặc đơn:

$d = "${Env:ProgramFiles(x86)}"  # LINE 6 (NO spaces inside brackets) 

Bạn chỉ cần quấn biến chứa() với {}. Không có dấu cách bên trong dấu ngoặc vuông.

+1

Cảm ơn @ravikanth! Tôi đã thất bại với "$ {Env: ProgramFiles (x86)}", lưu ý rằng nó chứa không gian. Tôi nên nhận ra rằng điều này khác với "$ {Env: ProgramFiles (x86)}", KHÔNG chứa khoảng trắng. Tôi đã thêm một số văn bản bổ sung vào câu trả lời của bạn để làm rõ. – jwfearn

+0

Tôi đã xóa thêm các dòng giống như trong bài đăng của tôi. Tôi hy vọng bạn không nhớ. – jwfearn

+0

Có, Cảm ơn bạn đã cập nhật :) – ravikanth

Các vấn đề liên quan