2011-11-16 55 views
187

Tôi đã bắt đầu học PowerShell một vài ngày trước, và tôi không thể tìm thấy bất cứ điều gì trên google mà những gì tôi cần vì vậy hãy chịu với câu hỏi của tôi.Cách tìm kiếm chuỗi trong nhiều tệp và trả về tên tệp trong Powershell?

Tôi đã được yêu cầu thay thế một số chuỗi văn bản thành ứng dụng Jboss chạy trên cửa sổ. Tôi không nhất thiết phải biết phần mở rộng của các tập tin đích có thể và tôi cũng không biết vị trí của chúng. Cho đến nay tôi đã cố gắng một cách đệ quy duyệt vào thư mục (get-ChildItem -recurse) và tìm chuỗi tôi đang tìm kiếm với get-nội dung và chọn dây:

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" 

Vấn đề là, tôi có thể thấy những lần xuất hiện của văn bản Tôi đang tìm kiếm, nhưng tôi không biết làm thế nào để nói với PS để trả về đường dẫn và tên cho mỗi tập tin phù hợp là tốt.

Làm cách nào để có được tên và vị trí của tệp chứa biểu thức tôi đang tìm?

+0

Có thể chỉnh sửa câu hỏi chung chung hơn. Câu trả lời cho câu hỏi này không liên quan gì đến JBoss hoặc ứng dụng của bạn mà bạn đang làm việc với nó ... –

Trả lời

289

này nên cung cấp cho các vị trí của các tập tin có chứa mô hình của bạn:

Get-ChildItem -recurse | Select-String -pattern "dummy" | group path | select name 
+1

Điều gì sẽ xảy ra nếu bạn muốn cũng MOVE những tệp đó? ... Tôi đang gặp lỗi với điều này, nơi tôi có thể ' t tham gia | Di chuyển mục đến cuối đó. – rud3y

+5

Move-Item không có tham số 'name'. Thử thêm '| % {Move-Item $ _. Name } ' –

+24

' Get-ChildItem -Recurse | Chọn chuỗi "dummy" -List | Chọn Path' chỉ trả về kết quả phù hợp đầu tiên cho mỗi tệp để có thể hiệu quả hơn một chút và tránh sự cần thiết phải nhóm chúng – ben

12

ống nội dung của bạn

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" 

để fl *

Bạn sẽ thấy rằng con đường là đã được trả về như là một tài sản của các đối tượng.

NẾU bạn muốn chỉ con đường, sử dụng select path hoặc select -unique path để loại bỏ các bản sao:

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" | select -unique path 
+1

Nhờ cả hai, đây chính xác là những gì tôi đang tìm kiếm. Thật không may, khi có nhiều thư mục con tham gia vào đường dẫn, sau đó PS cắt đường dẫn tuyệt đối và thêm ba dấu chấm ở cuối dòng như \ dir1 \ dir2 \ dir3 \ path ... vì vậy tôi không biết tệp nào được trả về . Có cách nào để nói với PS ít tham lam hơn vào các nhân vật và bận tâm hiển thị đường dẫn đầy đủ không? :) Cảm ơn rất nhiều! – Bluz

+3

Bạn cần thêm công tắc '-File' vào' Get-ChildItem' hoặc bạn kết thúc với một chuỗi lỗi không bao giờ kết thúc từ việc cố gắng gọi 'Get-Content' trên các thư mục. – RubberDuck

9
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"} 

này sẽ cung cấp cho bạn đầy đủ các chi tiết của tất cả các file

+0

Lệnh tối nghĩa nhất bao giờ cũng là –

5

Để giữ cho các chi tiết đầy đủ hồ sơ tại kết quả mảng bạn có thể sử dụng một sửa đổi nhỏ của câu trả lời được đăng bởi vikas368 (mà dường như không hoạt động tốt với tính năng tự động hoàn thành ISE):

Get-ChildItem -Recurse | Where-Object { $_ | Select-String -Pattern "dummy" } 

hoặc trong ngắn hạn:

ls -r | ?{ $_ | Select-String -Pattern "dummy" } 
42

Có rất nhiều câu trả lời chính xác ở đây, nhưng đây là đoạn code ngắn gọn nhất cho các biến thể khác nhau. Đối với mỗi biến thể, dòng trên cùng hiển thị cú pháp đầy đủ và phía dưới hiển thị cú pháp ngắn gọn.

Mục (2) là hình thức ngắn gọn hơn về câu trả lời từ Jon Z và manojlds, trong khi mục (1) tương đương với câu trả lời từ vikas368 và buygrush.

  1. Danh sách FileInfo đối tượng cho tất cả các file có chứa mẫu:

    Get-ChildItem -Recursefilespec| Where-Object { Select-Stringpattern$_ -Quiet } 
    ls -rfilespec| ? { slspattern$_ -q } 
    
  2. Danh sách tên file cho tất cả các file có chứa mẫu:

    Get-ChildItem -Recursefilespec| Select-Stringpattern| Select-Object -Unique Path 
    ls -rfilespec| slspattern| select -u Path 
    
  3. Danh sách FileInfo đối tượng cho tất cả các tệp không mẫu chứa:

    Get-ChildItem -Recursefilespec| Where-Object { !(Select-Stringpattern$_ -Quiet) } 
    ls -rfilespec| ? { !(slspattern$_ -q) } 
    
  4. Danh sách tên file cho tất cả các file không chứa mẫu:

    (Get-ChildItem -Recursefilespec| Where-Object { !(Select-Stringpattern$_ -Quiet) }).FullName 
    (ls -rfilespec| ? { !(slspattern$_ -q) }).FullName 
    
+0

Ngoài ra, nếu bạn chỉ tìm kiếm tệp có chứa mẫu ở bất kỳ đâu, bạn có thể bỏ cuộc sau khi tìm trường hợp đầu tiên bằng cách sử dụng tham số '-List' của [' Select-String'] (https://technet.microsoft.com/en-us/library/hh849903.aspx) – KyleMit

+0

Tôi ước OP đã hỏi một biến thể nhỏ của câu hỏi sao cho đây sẽ là AA. # 1 rất hữu ích và rõ ràng là @Michael Sorens groks PS! – cBlaine

2

này sẽ hiển thị một danh sách các đường dẫn đầy đủ đến từng file chứa chuỗi tìm kiếm:

foreach ($file in Get-ChildItem | Select-String -pattern "dummy" | Select-Object -Unique path) {$file.path} 

Lưu ý rằng nó không hiển thị tiêu đề phía trên kết quả và không hiển thị dòng văn bản chứa chuỗi tìm kiếm. Tất cả nó cho bạn biết là nơi bạn có thể tìm thấy các tập tin có chứa chuỗi.

+2

Bất kỳ ý tưởng nào về cách hiển thị số dòng nơi mẫu tìm thấy, cùng với tên tệp? –

5

Điều này sẽ hiển thị đường dẫn, tên tệp và dòng nội dung tìm thấy phù hợp với mẫu.

Get-ChildItem -Path d:\applications\*config -recurse | Select-String -Pattern "dummy" 
3

Nếu bạn tìm kiếm vào một thư mục, bạn có thể làm điều đó:

select-string -Path "c:\temp\*.*" -Pattern "result" -List | select Path 
2

Đây là cách tôi sẽ làm điều đó, bạn không cần get-nội dung:

ls -r | Select-String dummy | select line,path 

hoặc

ls -r | Select-String dummy | fl 

Để xem điều gì khác biệt phù hợp quan hệ là ...

+0

+1, Điều này làm việc hoàn hảo cho trường hợp của tôi, tuy nhiên sử dụng 'chọn Pattern, LineNumber, Filename' cho đầu ra ngắn gọn hơn. Dòng trả về tất cả mọi thứ trên dòng có chứa chuỗi mẫu của bạn. Bạn cũng có thể dễ dàng xuất kết quả này vào một csv nếu bạn muốn. – Protonova

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