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

批处理循环计时器/进度条二次循环失效,倒计时进入负数

批处理倒计时异常问题的排查与修复

问题诊断

  1. 核心原因:未启用延迟扩展
    批处理默认采用即时变量扩展,在执行代码块(如:loop循环)前会一次性解析所有%变量%为当前值。第二次进入:loop时,判断条件if %loopcount%==0仍使用第一次循环时的变量值,而非动态更新后的数值,导致永远无法触发结束逻辑,倒计时持续减至负数。
  2. 次要问题:倒计时逻辑不兼容非3倍数时间
    原代码每次循环直接减去3秒,若初始等待时间不是3的整数倍(如示例中的launcherStartTimeSSD=5),会出现倒计时越过0进入负数区间的情况。

解决方案

修复步骤

  1. 启用延迟扩展:在脚本开头添加setlocal enabledelayedexpansion,并将循环内动态判断的变量替换为!变量名!格式,确保变量值实时更新。
  2. 调整结束判断逻辑:将==0改为LEQ 0(小于等于0),覆盖所有倒计时结束的场景。
  3. 优化倒计时流程:将3秒拆分的逻辑改为逐秒检查,避免时间匹配问题,同时简化延迟代码。

修复后的完整代码

@echo off
setlocal enabledelayedexpansion
for /f "tokens=* delims==" %%G in (variables.txt) do set %%G
rem 读取variables.txt中的变量定义

:serverstart
set serverstatus=0
ECHO Starting Server ^(Aki.Server.exe^)...
@start Aki.Server.exe

if %driveType%==0 (
        echo Working... ^(%serverStartTimeSSD% Seconds, Using SSD Preset^)
        set loopcount=%serverStartTimeSSD%
) else if %driveType%==1 (
        echo Working... ^(%serverStartTimeHDD% Seconds, Using HDD Preset^)
        set loopcount=%serverStartTimeHDD%
)
:loop
rem 逐秒更新标题圆点动画与倒计时
set "dots=."
title Console - Saru's SPT Auto ^Start Script - WORKING!dots!      (!loopcount! Seconds Remaining)
timeout /t 1 /nobreak >Nul
set /a loopcount-=1
if !loopcount! LEQ 0 goto :check_finish

set "dots=.."
title Console - Saru's SPT Auto ^Start Script - WORKING!dots!    (!loopcount! Seconds Remaining)
timeout /t 1 /nobreak >Nul
set /a loopcount-=1
if !loopcount! LEQ 0 goto :check_finish

set "dots=..."
title Console - Saru's SPT Auto ^Start Script - WORKING!dots!  (!loopcount! Seconds Remaining)
timeout /t 1 /nobreak >Nul
set /a loopcount-=1
if !loopcount! LEQ 0 goto :check_finish

goto :loop

:check_finish
echo Finished.
if !serverstatus!==0 goto :launcherstart
goto :endstartup

:launcherstart
if !serverstatus!==1 goto :endstartup
ECHO Starting Launcher ^(Aki.Launcher.exe^)...
@start Aki.Launcher.exe
if %driveType%==0 (
        echo Working... ^(%launcherStartTimeSSD% Seconds, Using SSD Preset^)
        set loopcount=%launcherStartTimeSSD%
        set serverstatus=1
        goto :loop
) else if %driveType%==1 (
        echo Working... ^(%launcherStartTimeHDD% Seconds, Using HDD Preset^)
        set loopcount=%launcherStartTimeHDD%
        set serverstatus=1
        goto :loop
)

:endstartup
echo All processes finished.
pause
endlocal

关键修改说明

  • 用setlocal enabledelayedexpansion开启延迟扩展,!loopcount!和!serverstatus!确保循环内变量值实时生效。
  • 每次减1秒后立即检查!loopcount! LEQ 0,避免倒计时进入负数区间。
  • 简化延迟代码,直接用timeout /t 1 /nobreak >Nul实现1秒等待,移除冗余的for循环。
  • 新增:check_finish标签统一处理倒计时结束逻辑,代码结构更清晰。

内容的提问来源于stack exchange,提问作者SaruShinobie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 17:12:45