更高效的倒计时程序? [。蝙蝠]

More efficient countdown routine? [.BAT]

我正在尝试 运行 从 60:00 开始倒计时的脚本,其中 60 是秒数,00 是毫秒数。我根本无法让脚本正常运行。有人知道问题出在哪里吗?

:PhaseTwo
Set /a bignum=60
Set smallnum=00
Set /a handlevariable=1
Set /a bignumhandle=0
ping localhost -n 2 >nul

:StopWatchRoutine
If %bignum% EQU 00 GoTo :StopWatchEndCheck
:StopWatchEndCheckNo
If %bignum% EQU 9 set /a bignumhandle=1
If %smallnum% EQU 9 set /a handlevariable=1
If %handlevariable% EQU 1 GoTo :NumberMods
Set /a smallnum-=1
GoTo :StopWatchHandle

:StopWatchEndCheck
If %smallnum% EQU 01 GoTo :StopWatchExit
GoTo :StopWatchEndCheckNo

:NumberMods
If %smallnum% EQU 00 set /a smallnum=99
If %smallnum% EQU 00 set /a handlevariable=0
If %smallnum% EQU 01 set smallnum=00
If %smallnum% EQU 02 set smallnum=01
If %smallnum% EQU 03 set smallnum=02
If %smallnum% EQU 04 set smallnum=03
If %smallnum% EQU 05 set smallnum=04
If %smallnum% EQU 06 set smallnum=05
If %smallnum% EQU 07 set smallnum=06
If %smallnum% EQU 08 set smallnum=07
If %smallnum% EQU 09 set smallnum=08
If %smallnum% EQU 9 set smallnum=09
If %smallnum% EQU 99 set /a bignum-=1
If %bignumhandle% EQU 1 GoTo :BigNumMods
GoTo :StopWatchHandle

:BigNumMods
If %bignum% EQU 01 set bignum=00
If %bignum% EQU 02 set bignum=01
If %bignum% EQU 03 set bignum=02
If %bignum% EQU 04 set bignum=03
If %bignum% EQU 05 set bignum=04
If %bignum% EQU 06 set bignum=05
If %bignum% EQU 07 set bignum=06
If %bignum% EQU 08 set bignum=07
If %bignum% EQU 09 set bignum=08
If %bignum% EQU 9 set bignum=09


:StopWatchHandle 
cls
echo Program Launch Console, Version 1.0.2
echo.
echo StopWatch: %bignum%:%smallnum%
echo.
ping localhost -n 1 >nul
GoTo :StopWatchRoutine

:StopWatchExit
echo.
GoTo :PhaseThree

我将这个批处理文件用作用户界面的一部分,因此它的回显部分保持完整很重要。否则,欢迎就如何提高脚本效率提出任何建议。

感谢您的所有帮助,非常非常感谢。

对不起。先来几条评论:

  • 我不喜欢这样的问题:"Hey, my code don't works. Please review it and fix the problem"。您应该解释 代码应该做什么以及它真正做什么。
  • 我认为您在这里有一些困惑,从 "and 00 the number of milliseconds" 开始(毫秒有 3 位数字,厘秒有 2 位)。如果您希望程序尽可能快地刷新屏幕(以显示经过的毫秒数或厘秒数),为什么要使用ping 命令?其效果恰恰适得其反!

无论如何,如果你想要一个更高效的 Batch 倒计时程序,试试这个:

@echo off
setlocal EnableDelayedExpansion


:PhaseTwo

rem Get a CR control character (Ascii 13)
for /F %%a in ('copy /Z "%~F0" nul') do set "CR=%%a"

cls
echo Program Launch Console, Version 1.0.2
echo.
set /P "=StopWatch: 60.000!CR!" < NUL

set /A bignum=60, smallnum=2000
for /F "tokens=3 delims=:." %%a in ("%time%") do set "currentSec=%%a"

:StopWatchRoutine
for /F "tokens=3 delims=:." %%a in ("%time%") do if "%currentSec%" equ "%%a" (
   set /A smallnum-=4
) else (
   rem The next line will help to adjust previous smallnum's subtrahend
   REM ECHO/
   set "currentSec=%%a"
   set /A bignum-=1, smallnum=2000
   if !bignum! equ 0 goto StopWatchExit
)

:StopWatchHandle 
set /P "=StopWatch: %bignum%:%smallnum:~1% !CR!" < NUL
GoTo :StopWatchRoutine

:StopWatchExit
echo StopWatch: 0.000
echo/
echo.

请注意,为了尽可能真实地显示毫秒,您必须调整set /A smallnum-=4命令中的数字。 “4”适合我的电脑。