You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell拆分日期范围为4段并行获取Windows应用日志是否可行?

问题:将日期范围拆分为4个均等子范围的方式是否足够?

详细背景

我一直在研究如何通过PowerShell脚本提升Windows应用日志的获取速度,目前的思路是把日期范围拆分成4个部分,并行执行请求。

当前拆分逻辑代码

目前这段拆分日期范围的代码似乎可行,求其他思路或意见:

# 示例时间范围
$StartDate = (get-date).Addminutes(-10000)
$EndDate = (get-date) 

# 计算1/4时间段的分钟数
$Mins = (($EndDate - $StartDate).TotalMinutes /4)

$Start = $null
$End = $null 

for ($i = 1; $i -le 4; $i++) {

    if (!$Start) {
        $Start = $startDate
        $End = $StartDate.AddMinutes($Mins)
    } Else {
        $Start = $End.AddSeconds(1)
        $End = $End.AddMinutes($Mins)
    }

    Write-Host($Start)
    Write-Host($End)
    ' '
}

代码输出结果

3/2/2023 8:29:53 PM
3/4/2023 2:09:53 PM
 
3/4/2023 2:09:54 PM
3/6/2023 7:49:53 AM
 
3/6/2023 7:49:54 AM
3/8/2023 1:29:53 AM
 
3/8/2023 1:29:54 AM
3/9/2023 7:09:53 PM

更新尝试:使用EventLogReader读取日志

经讨论后,我尝试用PowerShell的EventLogReader读取日志,目前脚本可运行但需要梳理返回结果:

using namespace System.Diagnostics.Eventing.Reader
$Log = $null 
$Computer = $env:COMPUTERNAME

try {

    # 时间过滤器
    $start = [datetime]::UtcNow.AddHours(-1).ToString('o')
    $end = [datetime]::UtcNow.ToString('o')

    $filter = "*[System[TimeCreated[@SystemTime >= '{0}']]] and *[System[TimeCreated[@SystemTime <= '{1}']]]" -f $start, $end

    # 创建查询
    $query = [EventLogQuery]::new('Application', [PathType]::LogName, $filter)
    $query.Session = [EventLogSession]::new($Computer)

    # 读取日志
    $reader = [EventLogReader]::new($query)
    while($log = $reader.ReadEvent()) {
        $log
    }

}
finally {
    if ($reader) {
        $reader.Dispose()
    }
}

性能优化相关说明

  • 最快日志读取方式:经建议,上述EventLogReader方法适合获取大量日志数据;Get-WinEvent搭配过滤器适合获取少量特定日志;建议避免使用Get-EventLog。
  • 进一步性能优化:除上述代码外,可使用Start-Job进一步提速——将需要在各服务器执行的函数放入队列,用Start-Job并发调用,注意控制作业数量不超过服务器核心数,维持最大有效并发量。

内容的提问来源于stack exchange,提问作者Mike Q

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:50:33