我对 Powershell 有点菜鸟,所以请不要责骂我:-) 因此,我需要处理一些相当大的日志文件(600mb),我的脚本本质上是删除那些包含“Message Received”的行,然后标记这些行并将一些标记输出到输出文件。 p>
脚本的逻辑很好(虽然我确信它可以更有效),但问题是,当我向输出文件写入行并且文件随后变大时,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
最佳答案
如果您在管道中执行所有操作,则一次仅需要一个对象(在您的情况下文件中的一行)需要存储在内存中。
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 的属性名称来完成,但不太清楚。
关于memory - Powershell 内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/614317/