如何判断Windows未正常关机?如何检测异常关机触发场景?
嘿,这个问题问得相当实用!不管是排查系统问题还是监控设备状态,判断Windows是否异常关机都是很常见的需求,我给你梳理清楚手动判断和自动检测的方法:
一、手动判断Windows是否异常关机的方法
- 看开机提示:如果上次是异常关机(比如拔电源、硬按电源键强制关机),Windows开机时几乎都会弹出「Windows未正常关闭」的提示,还会让你选择启动模式(正常启动、安全模式等),这是最直观的信号。
- 查事件查看器日志:这是最权威的判断方式,步骤很简单:
- 按下
Win + R,输入eventvwr.msc回车打开事件查看器 - 依次展开「Windows日志」→「系统」
- 找来源为
EventLog、事件ID为6008的条目——这就是专门记录异常关机的日志,描述里会明确写「系统意外关闭」,还会标注具体的时间点。
顺便提一句:正常关机的话会有事件ID6005(系统启动)和6006(系统成功关机)的成对记录,如果只有6005却找不到对应的6006前置日志,那基本可以确定是异常关机了。
- 按下
二、自动检测异常关机的方法
如果需要批量排查或者实时监控,这些方法会更高效:
- 命令行快速查询:打开CMD或者PowerShell,直接用命令筛选异常关机日志:
CMD版本:
PowerShell版本:wevtutil qe System /q:"*[System[Provider[@Name='EventLog'] and EventID=6008]]" /f:text
执行后会直接列出所有异常关机的记录,适合快速排查或者嵌入脚本。Get-WinEvent -FilterHashtable @{LogName='System'; ID=6008} - 写脚本定期监控:如果需要每天自动检查有没有异常关机,可以写个PowerShell脚本,示例如下:
你可以把这个脚本添加到Windows任务计划里,设置成每天自动运行,甚至可以扩展加上邮件提醒功能(需要配置SMTP服务器)。# 获取最近24小时内的异常关机日志 $unexpectedShutdowns = Get-WinEvent -FilterHashtable @{ LogName='System' ID=6008 StartTime=(Get-Date).AddHours(-24) } -ErrorAction SilentlyContinue if ($unexpectedShutdowns) { Write-Host "⚠️ 检测到最近24小时内有异常关机记录:" foreach ($shutdown in $unexpectedShutdowns) { Write-Host "时间:$($shutdown.TimeCreated) | 描述:$($shutdown.Message)" } } else { Write-Host "✅ 最近24小时内无异常关机记录" } - 区分异常关机的具体原因:如果想知道是拔电源、硬按电源键还是系统崩溃导致的,可以结合「Microsoft-Windows-Kernel-Power」来源的日志,比如事件ID41(系统意外重启,通常和电源故障或系统崩溃有关),和6008日志配合看就能更精准定位原因。
内容的提问来源于stack exchange,提问作者Liudi Wijaya




