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

PowerShell按格式化日期时间排序系统事件日志问题求助

问题:筛选系统事件日志并按小时分钟维度去重排序

我需要列出系统事件日志中特定日期(如2023年12月6日)内InstanceId为506、507的事件时间,期望输出格式如下:

08:30       507
12:20       506
13:00       507
17:00       506

现有尝试及问题

我使用以下代码尝试实现,但输出既未按时间升序排列,还存在重复项:

Get-EventLog -LogName 'System' | Where { $_.TimeGenerated -ge (Get-Date('06/12/2023')) -and $_.TimeGenerated -lt (Get-Date('07/12/2023')) -and (506, 507) -contains $_.InstanceId } | Select-Object { $_.TimeGenerated.ToString('hh:mm') }, InstanceId | Sort-Object @{ Expression = "TimeGenerated.ToString('hh:mm')"; Descending = $false }

执行结果:

$_.TimeGenerated.ToString('hh:mm')  InstanceId
------------------------------------ ----------
13:00                                       507
17:00                                       506
08:30                                       507
12:20                                       506
12:20                                       506

后续调整及需求

我更新了代码,可实现按时间排序并按hh:mm:ss维度去重,但需要的是按hh:mm维度去重:

Get-EventLog -LogName 'System' | Where { $_.TimeGenerated -ge (Get-Date('06/12/2023')) -and $_.TimeGenerated -lt (Get-Date('07/12/2023')) -and (506, 507) -contains $_.InstanceId } | Select-Object TimeGenerated, InstanceId | Sort-Object -Property TimeGenerated -Unique

执行结果:

TimeGenerated       InstanceId
-------------       ----------
06/12/2023 13:00:12        507
06/12/2023 17:00:04        506
06/12/2023 08:30:38        507
06/12/2023 12:20:01        506
06/12/2023 12:20:28        506

注:若需要更大测试数据集,可筛选InstanceId为11、12的事件。


解决方案

方案1:结合分组与排序实现去重

Get-EventLog -LogName 'System' | 
    Where-Object { 
        $_.TimeGenerated -ge (Get-Date '2023-12-06') -and 
        $_.TimeGenerated -lt (Get-Date '2023-12-07') -and 
        (506, 507) -contains $_.InstanceId 
    } | 
    Select-Object @{Name='Time'; Expression={$_.TimeGenerated.ToString('hh:mm')}}, InstanceId |
    Group-Object Time, InstanceId |
    ForEach-Object { $_.Group | Select-Object -First 1 } |
    Sort-Object @{Expression={[DateTime]::ParseExact($_.Time, 'hh:mm', $null)}} |
    Format-Table -HideTableHeaders -AutoSize

方案2:利用排序+唯一值筛选(更简洁)

Get-EventLog -LogName 'System' | 
    Where-Object { 
        $_.TimeGenerated -ge (Get-Date '2023-12-06') -and 
        $_.TimeGenerated -lt (Get-Date '2023-12-07') -and 
        (506, 507) -contains $_.InstanceId 
    } | 
    Select-Object @{Name='Time'; Expression={$_.TimeGenerated.ToString('hh:mm')}}, InstanceId, @{Name='SortTime'; Expression={$_.TimeGenerated}} |
    Sort-Object SortTime |
    Select-Object Time, InstanceId -Unique |
    Format-Table -HideTableHeaders -AutoSize

逻辑说明

  1. 先通过Where-Object筛选指定日期范围和目标InstanceId的事件
  2. 构造Time属性存储格式化后的hh:mm时间,同时保留原始TimeGenerated作为SortTime用于精准排序
  3. 按原始时间排序后,通过-Unique参数按Time和InstanceId组合去重
  4. 最后用Format-Table隐藏表头并自动调整列宽,输出符合要求的格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 14:40:15