2015-11-04 16 views
20

Tôi muốn đọc từng dòng tệp trong PowerShell. Cụ thể, tôi muốn lặp qua tệp, lưu trữ mỗi dòng trong một biến trong vòng lặp và thực hiện một số xử lý trên dòng.Đọc từng dòng tệp trong PowerShell

Tôi biết Bash tương đương:

while read line do 
    if [[ $line =~ $regex ]]; then 
      # work here 
    fi 
done < file.txt 

Không có nhiều tài liệu về PowerShell vòng.

Trả lời

40

Không có nhiều tài liệu về vòng lặp PowerShell.

Tài liệu trên vòng trong PowerShell là dồi dào, và bạn có thể muốn kiểm tra các chủ đề trợ giúp sau: about_For, about_ForEach, about_Do, about_While.

foreach($line in Get-Content .\file.txt) { 
    if($line -match $regex){ 
     # Work here 
    } 
} 

Một giải pháp PowerShell ngữ cho vấn đề của bạn là ống dòng của tập tin văn bản vào ForEach-Object cmdlet:

Get-Content .\file.txt | ForEach-Object { 
    if($_ -match $regex){ 
     # Work here 
    } 
} 

Thay vì khớp regex bên trong vòng lặp, bạn có thể ống dòng thông qua Where-Object để chỉ lọc những người bạn quan tâm:

Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object { 
    # Work here 
} 
+0

Các liên kết không bị hỏng, nhưng bây giờ họ chuyển hướng cho 'docs.microsoft.com'. –

+0

'Get-Content' là thực sự xấu khi bạn cố đọc các tệp lớn –

+1

@KolobCanyon hoàn toàn đúng :-) bạn có thể thêm câu trả lời riêng về chi phí hiệu suất ở kích thước/quy mô –

8

Get-Content có hiệu suất kém; nó cố gắng đọc tập tin vào bộ nhớ cùng một lúc.

đọc C# (.NET) tập đọc từng dòng từng người một

foreach($line in [System.IO.File]::ReadLines("C:\path\to\file.txt")) 
{ 
     $line 
} 
+0

Tôi có thể sử dụng '[System.IO.File] :: ReadLines (" C: \ path \ to \ file.txt ") | ForEach-Object {...} '. Câu lệnh 'foreach' sẽ [tải toàn bộ bộ sưu tập vào một đối tượng] (https://blogs.technet.microsoft.com/heyscriptingguy/2014/07/08/getting-to-know-foreach-and-foreach-object/). 'ForEach-Object' sử dụng một đường dẫn để stream với. Bây giờ câu lệnh 'foreach' có thể sẽ nhanh hơn một chút so với lệnh' ForEach-Object', nhưng đó là bởi vì việc tải toàn bộ thứ vào bộ nhớ thường nhanh hơn. Tuy nhiên, 'Get-Content' vẫn còn khủng khiếp. –

+0

@BaconBits 'foreach()' là bí danh của 'Foreach-Object' –

+5

Đó là một quan niệm sai lầm rất phổ biến. 'foreach' là một câu lệnh, như' if', 'for', hoặc' while'. 'ForEach-Object' là một lệnh, như' Get-ChildItem'. Ngoài ra còn có một bí danh mặc định của 'foreach' cho' ForEach-Object', nhưng nó chỉ được sử dụng khi có một đường ống. Xem phần giải thích dài trong 'Get-Help about_Foreach', hoặc nhấp vào liên kết trong bình luận trước đó của tôi để xem toàn bộ bài viết của Microsoft The Scripting Guys về sự khác biệt giữa câu lệnh và lệnh. –

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