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