一个小白将根据PowerShell的进出口升技所以,请不要责备我:-)所以我有一些相当大的日志文件(600MB),我需要处理,我的剧本基本上剔除了那些包含行"收到的消息",然后tokenises那些行并将一些标记输出到输出文件.
脚本的逻辑很好(虽然我确定它可能更有效)但问题是,当我将行写入输出文件并且文件随后变得越来越大时,powershell使用的内存量也增加到了记忆力衰竭.
任何人都可以建议我如何阻止这种情况发生?我想将日志分解成只有10mb的临时文件然后处理临时文件而不是?
继承我的代码,你们给予的任何帮助都会很棒:-)
Get-Date | Add-Content -Path d:\scripting\logparser\testoutput.txt $a = Get-Content D:\scripting\logparser\importsample.txt foreach($l in $a){ #$l | Select-String -Pattern "Message Received." | Add-Content -Path d:\scripting\logparser\testoutput.txt if (($l | Select-String -Pattern "Message Received." -Quiet) -eq "True") { #Add-Content -Path d:\scripting\logparser\testoutput.txt -value $l $var1,$var2,$var3,$var4,$var5,$var6,$var7,$var8,$var9,$var10,$var11,$var12,$var13,$var14,$var15,$var16,$var17,$var18,$var19,$var20 = [regex]::split($l,'\s+') Add-Content -Path d:\scripting\logparser\testoutput.txt -value $var1" "$var2" "$var3" "$var4" "$var16" "$var18 } else {} } Get-Date | Add-Content -Path d:\scripting\logparser\testoutput.txt
Richard.. 7
如果您在管道中执行所有操作,则一次只能有一个对象(在您的情况下来自文件的一行)需要在内存中.
Get-Content $inputFile | Where-Object { $_ -match "Message Received" } | foreach-object -process { $fields = [regex]::split($_,'\s+') # An array is created Add-Content -path $outputFile -value [String]::Join(" ", $fields[0,1,2,3,15,17]) }
所述$fields[0,1,2,3,15,17]
创建的给定索引的阵列$fields
.
这也可以在单个管道中使用表达式而不是传递给Select-Object的属性名称来完成,但不太清楚.
如果您在管道中执行所有操作,则一次只能有一个对象(在您的情况下来自文件的一行)需要在内存中.
Get-Content $inputFile | Where-Object { $_ -match "Message Received" } | foreach-object -process { $fields = [regex]::split($_,'\s+') # An array is created Add-Content -path $outputFile -value [String]::Join(" ", $fields[0,1,2,3,15,17]) }
所述$fields[0,1,2,3,15,17]
创建的给定索引的阵列$fields
.
这也可以在单个管道中使用表达式而不是传递给Select-Object的属性名称来完成,但不太清楚.