2009-02-09 32 views
20

Trong kịch bản PowerShell của tôi, tôi đang chạy Select-String trên một số lượng file, tìm kiếm một chuỗi truyền vào nó thông qua một biến ($ id):Làm thế nào để bỏ qua các chuỗi thoát được lưu trữ trong biến chuỗi PowerShell?

foreach ($file in (ls "path\to\files")) { 
    $found = $false 
    $found = Select-String -Path $file $id -Quiet 
    if ($found) { 
     break 
    } 
} 

Thật không may, id biến $ đôi khi mọi thứ như "\ C" hoặc "\ T", trong đó Select-String cố gắng diễn giải là chuỗi thoát. Đây không phải là các trình tự thoát hợp lệ, vì vậy Select-String ném một lỗi. Chúng không nhằm mục đích thoát khỏi chuỗi (ví dụ: nó có thể là một phần của đường dẫn tệp như "C: \ Test"), vậy làm thế nào tôi có thể ngăn PowerShell/Select-String giải thích chúng như vậy? Tôi đã thử sử dụng dấu ngoặc đơn quanh $ id mà không có may mắn.

+0

Nhờ bất kỳ ai đã xóa nhận xét không hữu ích :-) – alastairs

Trả lời

32

Sử dụng tĩnh escape() phương pháp, nó chỉ thị các cơ biểu thức chính quy để giải thích những nhân vật này theo nghĩa đen chứ không phải là metacharacters:

$id = [regex]::escape($id) 

Bạn cũng có thể biến các lệnh để một liner (-path có thể mất một tập hợp các tệp):

Select-String -Path path\to\files\\* -Pattern ([regex]::escape($id)) -Quiet 
+0

Điều này đã phá vỡ nó, cảm ơn rất nhiều !! – alastairs

+0

Tôi muốn cung cấp +1 khác cho một lớp lót, nếu tôi có thể bỏ phiếu hai lần. :-) – Tomalak

+0

Đáng buồn là một lớp lót không hoạt động cho tình huống cụ thể - Tôi cắt ra một tham số -Filter và -Thông số – alastairs

0

Nếu chuỗi $ id có chứa thứ gì đó như TAB khi nó được chuyển cho bạn thì tôi không biết phương pháp được tích hợp để thoát an toàn trở lại "\ t". Bạn cần đảm bảo rằng tập lệnh của bạn được chuyển đúng chuỗi ở vị trí đầu tiên. I E. nó cần phải vượt qua 0x5C74 (\ t) không phải 0x09 (TAB). Vì vậy, việc thoát cần được thực hiện khi chuỗi tìm kiếm được xác định lần đầu tiên.

Regex.Escape sẽ thoát TAB -> \ t nhưng cũng sẽ thoát khỏi bất kỳ của những nhân vật đó có ý nghĩa trong biểu thức thông thường:

\, *, +,, |, {, [, (,)? , ^, $,., # và khoảng trắng

ví dụ:  . -> \.

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