2012-06-13 23 views
8

Được rồi, điều này khiến tôi phát điên vì regex của tôi đang làm việc trên Rubular, nhưng PowerShell không hoạt động như tôi mong đợi.PowerShell regex hoạt động với các chuỗi nhiều dòng như thế nào?

  1. Tôi đã thực hiện Get-ChildItem trên thư mục mạng và sau đó hướng đầu ra vào tệp txt.
  2. tôi đã đi để loại bỏ các thông tin thư mục từ tập tin văn bản xuất hiện như sau:

enter image description here

  1. Khi tôi sử dụng PowerShell để thử và viết một regex để loại bỏ các thông tin thư mục, tôi chạy vào một số vấn đề.

Khi tôi sử dụng:

$var = Get-Contnet "file path" 
$var -match "Directory.*" 

PowerShell lấy văn bản Tôi đang tìm kiếm, nhưng nó không lấy văn bản mà bắt đầu trên một dòng mới, tôi nhận được:

Directory: \\Drive\Unit\Proposals\Names\Location\crazy folder path\even crazier folder path\unbelievable folder path\ 

Vì vậy, khi tôi sử dụng:

$var -match "Directory.*\n.*" 

Tôi không nhận được gì ...

Khi tôi thử điều này trên Rublar nó hoạt động tốt, những gì tôi thiếu ở đây? Bất kỳ trợ giúp sẽ là tuyệt vời, cảm ơn!

Trả lời

19

Câu trả lời của Filburt là câu trả lời hay nhất và biểu hiện thông thường là công cụ tốt nhất để sử dụng tại đây. Tuy nhiên, bạn gặp phải vấn đề có thể gây nhầm lẫn một lần nữa xuống đường. Vấn đề ở đây là biến bạn điền với Get-Content không phải là chuỗi nhiều dòng. Đây là một mảng của chuỗi:

$var = Get-Content "file path" 
$var.GetType() # Shows 'Object[]' 

Khi bạn chạy một trận đấu regex chống $var, nó phù hợp với từng đối tượng trong mảng (mỗi dòng trong file) riêng. Nó không thể trùng khớp với kết thúc của một dòng bởi vì dòng kế tiếp là một đối tượng mới.

Một workaround ở đây là để làm phẳng mà mảng các chuỗi thành một chuỗi duy nhất như thế này:

$var = (Get-Content "file path" | Out-String) 
$var.GetType() # Shows 'String' now 

Trong Powershell đôi khi nó có thể được khôn lanh để biết khi nào bạn đang làm việc với một đối tượng String duy nhất so với một mảng Strings. Nếu bạn xuất chúng ra bàn điều khiển, chúng xuất hiện giống hệt nhau. Trong những trường hợp đó, GetType()Out-String có thể là các công cụ hữu ích.

Edit: Tính đến Powershell 3.0, các nhà cung cấp Filesystem bao gồm một công tắc -Raw cho Get-Content. Công tắc đó chỉ thị Get-Content để đọc tệp cùng một lúc mà không chia nhỏ nó thành các đoạn. Nó nhanh hơn đáng kể so với việc sử dụng giải pháp Out-String, bởi vì nó không lãng phí thời gian kéo các mảnh ra ngoài chỉ để đưa chúng trở lại với nhau một lần nữa.

+1

Cảm ơn bạn! Tôi chắc chắn đồng ý rằng Filburt có ý tưởng đúng, nhưng tôi muốn hiểu những gì tôi đã mất tích. Cảm kích nhất! – Steve

6

Tại sao không chọn thuộc tính mong muốn trước khi đưa chúng ra tệp của bạn?

Get-ChildItem | Select-Object Mode, LastWriteTime, Length, Name | Out-File Result.txt 
+0

Thì thưa ngài, điều đó thật điên rồ! Tôi thực sự nghĩ về điều đó sau khi nghĩ về điều này nhiều hơn một chút, nhưng tôi muốn hiểu tại sao regex của tôi không hoạt động như tôi nghĩ rằng nó nên để tham khảo trong tương lai. – Steve

1

Có thể các dòng không kết thúc bằng \n. Tôi tin rằng các ký tự chấm dứt dòng tiêu chuẩn trong Windows là \r\n. Hãy thử viết lại regex của bạn để phù hợp với điều đó.

+0

Cảm ơn bạn đã phản hồi. Sử dụng $ var -match "Directory. * \ R \ n. *" Hoặc bất kỳ kết hợp nào của \ r \ n không thực hiện thủ thuật. – Steve

+0

Cảm ơn !!! Đã làm hỏng bộ não của tôi trong một giờ cho đến khi tôi nhìn thấy bài đăng của bạn và giải quyết nó. – Jonathan

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