如何通过批处理读取系统事件查看器的Kernel-Power事件及唤醒信息?
用CMD/BAT实现系统启动状态与日志查询方案
一、核心实现工具:wevtutil
Windows自带的事件日志查询工具wevtutil可直接在CMD/BAT中调用,能读取系统日志各类事件(包括Kernel-Power相关记录),完全覆盖你无法通过powercfg实现的需求。
二、具体需求实现
1. 判断当前启动类型(睡眠唤醒/冷启动)
通过过滤System日志中最新的启动类事件判断:
- 冷启动(按钮/网络等触发的开机)对应Kernel-Power事件ID 6005(系统已启动)
- 睡眠唤醒对应Kernel-Power事件ID 107(系统从睡眠状态唤醒)
示例BAT代码:
@echo off setlocal enabledelayedexpansion :: 查询最新的系统启动/唤醒事件 for /f "tokens=*" %%a in ('wevtutil qe System /q:"*[System[Provider[@Name='Microsoft-Windows-Kernel-Power'] and (EventID=6005 or EventID=107)]]" /c:1 /rd:true /f:text') do ( set "event=%%a" if "!event:Event ID: 107=!" neq "!event!" ( echo 当前启动类型:睡眠唤醒 ) else if "!event:Event ID: 6005=!" neq "!event!" ( echo 当前启动类型:冷启动(按钮/网络等触发) ) ) endlocal
2. 获取上次睡眠唤醒的时间/距今时长
查询最新的Kernel-Power事件ID 107的时间戳,借助PowerShell计算距今时长(原生BAT日期处理逻辑较繁琐):
示例BAT代码:
@echo off setlocal enabledelayedexpansion :: 获取最新的睡眠唤醒事件时间 for /f "tokens=2,3,4 delims= " %%a in ('wevtutil qe System /q:"*[System[Provider[@Name='Microsoft-Windows-Kernel-Power'] and EventID=107]]" /c:1 /rd:true /f:text ^| findstr /i "Time Created"') do ( set "wake_time=%%a %%b %%c" echo 上次睡眠唤醒时间:!wake_time! ) :: 计算距今时长 powershell -Command "$wakeTime = [DateTime]::Parse('%wake_time%'); $now = Get-Date; $span = $now - $wakeTime; Write-Host '距今时长:' $span.Days '天' $span.Hours '小时' $span.Minutes '分钟'" endlocal
3. 读取系统日志任意消息及触发时间
使用wevtutil指定日志名称、过滤条件即可提取任意事件的时间和消息内容,示例命令:
:: 读取Application日志中最近10条警告级别事件 wevtutil qe Application /q:"*[System[Level=3]]" /c:10 /rd:true /f:text :: 读取Windows Update的所有系统日志事件 wevtutil qe System /q:"*[System[Provider[@Name='Microsoft-Windows-WindowsUpdateClient']]]" /f:text
4. 查询所有Kernel-Power事件
直接过滤System日志中所有来自Microsoft-Windows-Kernel-Power的事件,示例命令:
:: 导出所有Kernel-Power事件到文本文件 wevtutil qe System /q:"*[System[Provider[@Name='Microsoft-Windows-Kernel-Power']]]" /f:text > Kernel-Power-Logs.txt :: 查看最新的10条Kernel-Power事件 wevtutil qe System /q:"*[System[Provider[@Name='Microsoft-Windows-Kernel-Power']]]" /c:10 /rd:true /f:text
注意事项
- 部分
wevtutil命令需管理员权限执行,建议右键以管理员身份运行BAT文件 - 若需纯BAT实现日期计算,需编写复杂的字符串解析逻辑,借助PowerShell是更简洁的方案
内容的提问来源于stack exchange,提问作者Spectraljump
相关产品推荐
相关产品推荐

