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
逻辑说明
- 先通过
Where-Object筛选指定日期范围和目标InstanceId的事件 - 构造
Time属性存储格式化后的hh:mm时间,同时保留原始TimeGenerated作为SortTime用于精准排序 - 按原始时间排序后,通过
-Unique参数按Time和InstanceId组合去重 - 最后用
Format-Table隐藏表头并自动调整列宽,输出符合要求的格式
内容的提问来源于stack exchange,提问作者FrinkTheBrave
相关产品推荐
相关产品推荐

