2011-08-23 23 views
6

tôi thấy tuyên bố Powershell này trong gần đây Hanselminutes post -

cat test.txt | foreach-object {$null = $_ -match '<FancyPants>(?<x>.*)<.FancyPants>'; $matches.x} | sort | get-unique 

Tôi đang cố gắng tìm hiểu Powershell vào lúc này và tôi nghĩ rằng tôi hiểu hầu hết những gì đang xảy ra -

  • tuyên bố vòng qua từng dòng của 'test.txt' và chạy một regex so với dòng hiện tại
  • Tất cả các kết quả được đối chiếu và sau đó sắp xếp và bản sao loại bỏ

hiểu biết của tôi dường như rơi xuống khu vực này của báo cáo kết quả -

$null = $_ -match '<FancyPants>(?<x>.*)<.FancyPants>'; $matches.x 
  • là '$null =' một phần của mã làm gì, tôi nghi ngờ đây là để xử lý một tình huống khi không phù hợp được trả lại nhưng tôi không chắc chắn làm thế nào nó hoạt động?
  • Có phải '$matches.x' trả lại các kết quả được tìm thấy không?

Trả lời

8

Có, kết quả điều hành -match trong True hoặc False; gán cho $null ngăn chặn đầu ra.

Cú pháp regex (?<>) tạo nhóm chụp. Trong trường hợp này, tạo nhóm chụp được gọi là x cho bất kỳ ký tự nào giữa <FancyPants><.FancyPants>. $matches chứa thông tin đối sánh cho trận đấu cuối cùng. Các nhóm chụp có thể được tham chiếu bởi $matches.CaptureGroupName.

Dưới đây là ví dụ bạn có thể sử dụng để xem những gì có trong biến số $Matches.

'123 Main','456 Broadway'| foreach{$_; $null = $_ -match '(?<MyMatch>\d+)'; ($Matches| ft *)} 

Trong ví dụ này, bạn sẽ sử dụng $Matches.MyMatch để tham chiếu trận đấu.

+0

Vì vậy, '$ matches.x' chứa các kết quả phù hợp cho đối tượng hiện tại, PS có tự động đối chiếu tất cả các tập hợp kết quả' $ matches' thành một tập kết quả lớn không? – ipr101

+0

@ ipr101 Không, nó chỉ giữ được trận đấu cuối cùng. Tôi đã cập nhật câu trả lời của tôi với một ví dụ bạn có thể sử dụng để xem những gì có trong biến '$ Matches'. – Rynant

+0

cảm ơn bạn đã có ý nghĩa hơn bây giờ – ipr101

5

'$ null = ...' được sử dụng để chặn kết quả so sánh. Bạn có thể đã thấy nội dung nào đó tương tự, như:

command | Out-Null 

Ở trên, lệnh ghép ngắn Out-Null được sử dụng để chặn đầu ra. Trong một số trường hợp, bạn cũng có thể thấy điều này:

[void] (...) 

Về cơ bản, tất cả các ví dụ đều làm tương tự, bỏ qua đầu ra. Nếu bạn không sử dụng một trong các kết quả trên là sẽ viết lại cho các đường ống và bạn có thể nhận được kết quả bất ngờ từ các lệnh tiếp tục xuống trong đường ống.

+1

Xem thêm http://stackoverflow.com/questions/5260125/whats-the-better-cleaner-way-to-ignore-output-in-powershell –

+0

Cảm ơn. Tôi nhớ một bài đăng từ nhóm PowerShell (từ James Brundage?) Về điều này nhưng tôi không thể tìm thấy nó. –

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