如何通过PowerShell脚本定期删除事件查看器中应用与系统日志的严重错误(Critical Errors)
如何通过PowerShell脚本定期删除事件查看器中应用与系统日志的严重错误(Critical Errors)
我完全懂你的困扰——想每周自动清理事件查看器里应用和系统日志的严重错误(Critical),但之前用wevtutil操作时不小心清空了整个日志,还被Windows文档里模糊的Level参数搞晕了对吧?我来帮你一步步解决这个问题。
先搞懂Windows事件日志的Level对应值
这是你之前踩坑的核心原因,Windows事件日志的Level数值对应关系是明确的:
- Level=1:Critical(严重错误,就是你要删除的目标)
- Level=2:Error(普通错误)
- Level=3:Warning(警告)
- Level=4:Information(信息)
- Level=5:Verbose(详细日志)
你之前用了Level=2,其实是匹配普通错误,而且更关键的是:wevtutil cl命令是直接清空整个日志,不管你管道传过来的筛选结果,这就是为什么你把所有日志都删掉了。
正确的PowerShell清理脚本
我们需要先筛选出所有Critical级别的事件,获取它们的RecordID,再逐个删除指定事件,而不是清空整个日志。下面是完整的脚本:
<# .SYNOPSIS 清理应用和系统日志中的严重错误(Critical Events) #> # 处理应用日志中的严重错误 Write-Host "正在清理应用日志中的严重错误..." $appCriticalRecords = wevtutil qe Application /q:"*[System[(Level=1)]]" /f:xml | Select-String -Pattern '<RecordID>(\d+)</RecordID>' | ForEach-Object { $_.Matches.Groups[1].Value } foreach ($recordId in $appCriticalRecords) { wevtutil el Application /id:$recordId Write-Host "已删除应用日志RecordID: $recordId" } # 处理系统日志中的严重错误 Write-Host "`n正在清理系统日志中的严重错误..." $sysCriticalRecords = wevtutil qe System /q:"*[System[(Level=1)]]" /f:xml | Select-String -Pattern '<RecordID>(\d+)</RecordID>' | ForEach-Object { $_.Matches.Groups[1].Value } foreach ($recordId in $sysCriticalRecords) { wevtutil el System /id:$recordId Write-Host "已删除系统日志RecordID: $recordId" } Write-Host "`n清理完成!"
脚本说明
- 用
wevtutil qe查询指定日志中Level=1的事件,输出为XML格式方便提取RecordID - 用
Select-String匹配XML中的RecordID值 - 遍历每个RecordID,用
wevtutil el(注意是el不是cl!el是删除指定事件,cl是清空日志)删除对应事件
配置任务计划程序定期执行
要实现每周自动运行,按以下步骤操作:
- 打开任务计划程序,点击右侧的「创建任务」
- 常规选项卡:勾选「不管用户是否登录都要运行」,并勾选「使用最高权限运行」(删除日志需要管理员权限)
- 触发器选项卡:点击「新建」,选择「每周」,设置你想要的执行时间和重复周期
- 操作选项卡:点击「新建」,操作选择「启动程序」,程序或脚本填
powershell.exe,添加参数填:
(替换成你实际的脚本保存路径)-ExecutionPolicy Bypass -File "C:\Path\To\Your\Clean-CriticalEvents.ps1" - 设置选项卡:可以根据需要勾选「如果任务运行时间超过X小时就停止」等选项,确保任务稳定运行
测试建议
在配置任务计划前,先以管理员身份打开PowerShell,运行脚本测试:
- 可以先把脚本中的
wevtutil el换成Write-Output $recordId,这样只会输出要删除的RecordID,不会实际删除,确认筛选结果正确后再改回删除命令
备注:内容来源于stack exchange,提问作者Baldovín Cadena Mejía




