我正在撰寫一個腳本,用Powell Shell在多個日志檔案中搜索一個特定的模式。在執行該腳本時有嚴重的記憶體泄漏,所以我想知道如何逐個搜索檔案。幫助。
$LOG_FILE = 'C: est est_*.log
$FIND_LINE = Get-Content $LOG_FILE | findstr 'test'
uj5u.com熱心網友回復:
Get-Content很慢,而且占用記憶體,所以最好讓Select-String - PowerShell的功能更全面的類似findstr.exe - 直接搜索相關檔案:
$linesFound = (Select-String -Path C:testtest est_*. log -Pattern 'test').Line
注意:
默認情況下,
-Pattern引數被解釋為regex;添加-SimpleMatch開關來執行verbatim子串搜索。Select-String,像PowerShell一般,默認是大小寫不敏感的;
如果需要,請添加-CaseSensitive。Select-String將其找到的行包裹在[Microsoft.PowerShell.Commands.MatchInfo]實體中,這些實體包含關于每個匹配的元資料;訪問.Line屬性回傳匹配行。- 在PowerShell (Core) 7 中,您可以使用
-Raw開關來直接只請求匹配行。
- 在PowerShell (Core) 7 中,您可以使用
uj5u.com熱心網友回復:
將日志檔案放入一個陣列中,然后回圈瀏覽它們。不要使用findstr,因為那不是原生的Powershell,而是一個舊的cmd可執行程式。使用Select-String,正如其他人所說的。
[array]$LOG_FILE = Get-ChildItem C: est est_*.log
[string[]]$FIND_LINE = ForEach ($L in$LOG_FILE) { Get-Content $L | Select-String 'test' }
然后你可以像這樣把結果匯出到一個文本檔案:
$FIND_LINE | Out-File "C。 estFoundLines. txt"
既然你提到了記憶體泄漏之類的問題。Powershell可能會吃掉它在特定會話中從未回傳的記憶體,但如果你把它保存在一個腳本中并作為一個腳本執行,那么它應該在腳本結束后清除記憶體。 然而,有一些技巧可以清理回圈內的記憶體,比如這個用于垃圾收集的dotnet命令:
[system.gc]::Collect()
這將給回圈的每一次迭代增加一點處理時間,所以我將測驗有無垃圾收集的時間,以確保它是值得的。 我建議還可以閱讀這里提到的一些其他方法和注意事項。 http://www.jhouseconsulting.com/2017/09/25/addressing-the-powershell-garbage-collection-bug-1825
而且還要使用PowerShell 7(如果你能安裝的話),因為它可能會更快、更有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/326694.html
標籤:
