You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

定时关机.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 07:15:07