【发布时间】:2021-06-15 07:02:39
【问题描述】:
我构建了一个脚本来过滤日志文件中的多个消息。我现在使用的文件大约有 400.000 行,当我用以下代码寻找匹配项时,他需要很长时间,因为我添加了进度条。有没有办法让它更有效率。如果我是对的,那么需要这么长时间的原因是他通过的每一行都会刷新进度条 Gui。
$i= 0
$path = ""
$length = (Get-Content $path).Length
#Datum, Hostname und Message Nummer
$result = Get-Content $path | ForEach-Object {
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)
}
}
# update counter and write progress
$i++
Write-Progress -activity "Searching for matches" -status "Scanned: $i of $($length)" -percentComplete (($i / $length) * 100)
}
#Messages Counted
$cumulative = $result | Group-Object -Property IP | ForEach-Object {
[PsCustomObject]@{
IP = $_.Name
Messages = ($_.Group | Measure-Object -Property Messages -Sum).Sum
DNSName = $_.Group[0].DNSName
Date = ($_.Group | Sort-Object Date)[-1].Date
}
}
【问题讨论】:
-
Write-Progress速度很慢,您可能会考虑调用它的次数与屏幕宽度一样多(比如说 200 个字符):if ($i % [math]::floor($length / 200) -eq 0) { Write-Process ...
标签: powershell foreach progress-bar