如何为现有PowerShell SMTP日志过滤脚本添加进度条
PowerShell SMTP日志分析脚本添加进度条实现方案
要给两段逻辑分别添加进度条,核心思路是提前获取待处理对象的总数量,再循环处理过程中实时计算进度并调用Write-Progress更新显示,具体实现如下:
第一阶段:日志解析逻辑添加进度条
首先提前读取日志文件获取总行数,避免流处理模式下无法计算进度百分比:
# 替换为实际SMTP日志文件路径 $logPath = "你的日志文件路径" $logLines = Get-Content -Path $logPath $totalLines = $logLines.Count $currentLine = 0 $result = $logLines | ForEach-Object { $currentLine++ # 每100行更新一次进度,避免大文件场景下频繁刷新拖慢性能,小文件可删除此判断 if ($currentLine % 100 -eq 0 -or $currentLine -eq $totalLines) { $progressPercent = [math]::Round(($currentLine / $totalLines) * 100, 2) Write-Progress -Activity "正在解析SMTP日志条目" -Status "已处理 $currentLine / $totalLines 行,进度:$progressPercent%" -PercentComplete $progressPercent } if($_ -match '(\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2}).*\(((?:\d{1,3}\.){3}\d{1,3})\) disconnected\.?\s+(\d+) message\[s\]'){ try { $dns = [System.Net.Dns]::GetHostEntry($matches[2]).HostName } catch { $dns = 'Not available' } [PsCustomObject]@{ IP = $matches[2] Messages = [int]$matches[3] DNSName = $dns Date = [datetime]::ParseExact($matches[1], 'dd.MM.yyyy HH:mm:ss', $null) } } } # 关闭当前阶段进度条 Write-Progress -Activity "正在解析SMTP日志条目" -Completed
第二阶段:IP维度统计逻辑添加进度条
提前获取IP分组的总数量,处理每个分组时更新进度:
$ipGroups = $result | Group-Object -Property IP $totalGroups = $ipGroups.Count $currentGroup = 0 $cumulative = $ipGroups | ForEach-Object { $currentGroup++ $progressPercent = [math]::Round(($currentGroup / $totalGroups) * 100, 2) Write-Progress -Activity "正在统计IP维度入站邮件总量" -Status "已处理 $currentGroup / $totalGroups 个IP,进度:$progressPercent%" -PercentComplete $progressPercent [PsCustomObject]@{ IP = $_.Name Messages = ($_.Group | Measure-Object -Property Messages -Sum).Sum DNSName = $_.Group[0].DNSName Date = ($_.Group | Sort-Object Date)[-1].Date } } # 关闭当前阶段进度条 Write-Progress -Activity "正在统计IP维度入站邮件总量" -Completed
补充说明
两段代码可以直接按顺序拼接执行,无需额外调整逻辑。如果处理的日志文件体积较小,可直接删除第一阶段的100行更新限制,每行处理后都刷新进度也不会有明显性能损耗。
内容的提问来源于stack exchange,提问作者Trippin
相关产品推荐
相关产品推荐

