2012-04-13 33 views
8

Tôi đang cố gắng xác thực sự tồn tại của tệp nhưng vấn đề là tên tệp có dấu ngoặc trong tên nghĩa là c: \ test [R] 10005404, Không thành công với Nhận xét, [S] SiteName.txt.

Tôi đã thử sử dụng phương thức .replace chuỗi không thành công.

$a = c:\test\[R] 10005404, Failed with Comments, [S] SiteName.txt 
$Result = (Test-Path $a) 
# Returns $False even though the file exists. 

Cố gắng

$a = $a.Replace("[", "`[") 
$a = $a.Replace("]", "`]") 

$Result = (Test-Path $a) 
# Also returns $False even though the file exists. 

Ý tưởng sẽ được đánh giá rất nhiều. Cảm ơn, dầu thánh

+0

Sẽ có dấu ngoặc kép xung quanh tên đường dẫn: '$ a = 'c: \ test \ [R] 10005404, Không thành công với nhận xét, [S] SiteName.txt''. Đây có phải chỉ là một lỗi đánh máy, hoặc là nó trong mã của bạn? – Rynant

+0

Windows cũ [Mẹo PowerShell của Tuần] (http://technet.microsoft.com/en-us/library/ff730956.aspx) giải thích lý do và giải pháp. Đây là một loại câu hỏi trùng lặp từ [powershell get-childitem không thể xử lý tên tập tin bắt đầu bằng [ký tự ngay cả với ký tự thoát] (http://stackoverflow.com/a/9508802/608772) – JPBlanc

Trả lời

21

Hãy thử sử dụng các tham số -LiteralPath:

Test-Path -LiteralPath 'C:\[My Folder]' 

Dấu ngoặc vuông có ý nghĩa đặc biệt.

Nó thực sự là một tính năng POSIX để bạn có thể làm điều này:

dir [a-f]* 

này sẽ cung cấp cho bạn tất cả mọi thứ trong thư mục hiện tại mà bắt đầu bằng chữ cái từ A đến F. Bash có các tính năng tương tự.

5

Có ít nhất ba cách để ứng dụng hoạt động.

Sử dụng thứ gì đó tương tự như cách tiếp cận của bạn, bạn cần thêm 2 dấu backticks khi sử dụng dấu ngoặc kép vì một dấu gạch chéo đơn sẽ được đánh giá là ký tự thoát trước khi được gửi đến phương thức Replace.

$a = "c:\test\[R] 10005404, Failed with Comments, [S] SiteName.txt" 
$a = $a.Replace("[", "``[") 
$a = $a.Replace("]", "``]") 
$Result = Test-Path $a 

Sử dụng dấu nháy đơn trong phương pháp Replace cũng sẽ ngăn không cho xóa các dấu gạch chéo.

$a = "c:\test\[R] 10005404, Failed with Comments, [S] SiteName.txt" 
$a = $a.Replace('[', '`[') 
$a = $a.Replace(']', '`]') 
$Result = Test-Path $a 

Cuối cùng, bạn có thể sử dụng LiteralPath tham số mà không sử dụng ký tự đại diện (dấu ngoặc vuông được sử dụng bởi PowerShell phù hợp để xác định một tập hợp các ký tự có thể được xuất hiện).

$a = "c:\test\[R] 10005404, Failed with Comments, [S] SiteName.txt" 
$Result = Test-Path -LiteralPath $a 
+0

+1 Đầu tiên là giải pháp lý tưởng khi cần để sử dụng các ký tự đại diện như '* .txt' cùng với các tệp hoặc thư mục có' ['hoặc'] 'trong tên của chúng – user66001

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