定时关机.BAT脚本问题求助:倒计时不显示+无法检测关机请求
自动关机BAT脚本问题修复方案
问题描述
- 设置关机时长后,无法显示60秒取消倒计时,只能等待自动执行,无直观剩余时间提示
- 再次运行脚本时,无法检测已存在的关机请求,也无法展示剩余时长、已过去时长等信息
修复后的完整代码
@echo off setlocal enabledelayedexpansion set "info_file=%TEMP%\shutdown_info.txt" :: 检测是否存在待执行的关机请求 set "has_pending=0" set "remaining_sec=0" for /F "tokens=*" %%i in ('shutdown /a 2^>^&1 ^| findstr /C:"pending shutdown" /C:"time remaining"') do ( set "has_pending=1" :: 提取剩余时间(适配英文系统输出格式) for /F "tokens=3,4,5 delims=: ,()" %%a in ("%%i") do ( if "%%b"=="hour" set /a remaining_sec=%%a*3600 if "%%b"=="minute" set /a remaining_sec=%%a*60 if "%%c"=="minute" set /a remaining_sec+=%%b*60 ) ) if %has_pending% equ 1 ( :: 读取记录的关机信息 if exist "%info_file%" ( for /F "tokens=1,2" %%a in (%info_file%) do ( set "total_sec=%%a" set "create_time=%%b" ) set /a elapsed_sec=!total_sec! - !remaining_sec! set /a elapsed_min=!elapsed_sec!/60, elapsed_sec=!elapsed_sec!%%60 set /a remaining_min=!remaining_sec!/60, remaining_sec=!remaining_sec!%%60 echo 当前存在待执行的关机请求: echo 总计划时长:!total_sec!/60 分钟 echo 已过去时长:!elapsed_min!分!elapsed_sec!秒 echo 剩余关机时长:!remaining_min!分!remaining_sec!秒 echo. ) else ( set /a remaining_min=!remaining_sec!/60, remaining_sec=!remaining_sec!%%60 echo 当前存在待执行的关机请求,但无历史记录信息 echo 剩余关机时长:!remaining_min!分!remaining_sec!秒 echo. ) :: 显示60秒取消倒计时 echo 请选择操作:C=取消关机,N=继续执行 for /L %%s in (60,-1,1) do ( cls echo 当前存在待执行的关机请求 echo 剩余取消操作时间:%%s秒 echo 按C取消,按N继续 timeout /t 1 /nobreak > nul for /F "tokens=*" %%k in ('choice /C CN /N /T 1 /D N') do set "key=%%k" if "!key!"=="C" goto CANCEL_SHUTDOWN if "!key!"=="N" goto END ) goto END ) :: 无待执行请求,获取用户输入时长 set /p hours=请输入关机小时数(留空则只输入分钟): set /p minutes=请输入关机分钟数: set total_sec=0 if defined hours set /a total_sec=%hours% * 3600 if defined minutes set /a total_sec+=%minutes% * 60 if %total_sec% equ 0 ( echo 请输入有效的时长! pause exit /b 1 ) :: 记录关机信息到临时文件 echo %total_sec% %time::=% > "%info_file%" :: 显示60秒取消倒计时 echo 你的电脑将在%total_sec%/60分钟后关机 echo 请选择操作:C=取消关机,N=继续执行 for /L %%s in (60,-1,1) do ( cls echo 电脑将在%total_sec%/60分钟后关机 echo 剩余取消操作时间:%%s秒 echo 按C取消,按N继续 timeout /t 1 /nobreak > nul for /F "tokens=*" %%k in ('choice /C CN /N /T 1 /D N') do set "key=%%k" if "!key!"=="C" goto CANCEL_SHUTDOWN if "!key!"=="N" goto SCHEDULE_SHUTDOWN ) :SCHEDULE_SHUTDOWN shutdown /s /t %total_sec% echo 关机计划已设置完成! exit /b 0 :CANCEL_SHUTDOWN shutdown /a > nul 2>&1 if exist "%info_file%" del "%info_file%" echo 关机已取消! pause exit /b 0 :END echo 继续执行关机计划... exit /b 0
问题修复说明
1. 60秒倒计时显示修复
替换原脚本中静默执行的choice命令,改用for /L循环结合timeout实现每秒刷新的倒计时界面,同时实时监听用户按键操作,让用户能直观看到剩余取消时间。
2. 关机请求检测与信息记录修复
- 状态检测优化:通过
shutdown /a 2>&1捕获系统输出判断是否存在待执行关机请求,避免直接取消任务;同时提取剩余时间进行格式化计算。 - 信息持久化:使用
%TEMP%\shutdown_info.txt存储计划总时长和创建时间戳,再次运行脚本时读取该文件,计算已过去时长和剩余时长并展示。 - 变量作用域修复:启用
setlocal enabledelayedexpansion,解决for循环中变量无法实时更新的问题,确保时间计算准确。
内容的提问来源于stack exchange,提问作者Albie
相关产品推荐
相关产品推荐

