Более эффективная процедура обратного отсчета? [.ЛЕТУЧАЯ МЫШЬ]

Я пытаюсь запустить скрипт, который ведет обратный отсчет с 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

Я использую этот пакетный файл как часть пользовательского интерфейса, поэтому важно, чтобы его эхо-часть оставалась нетронутой. В противном случае приветствуются любые предложения о том, как сделать скрипт более эффективным.

Спасибо за вашу помощь, это очень, ОЧЕНЬ ценно.


person John Smith    schedule 29.07.2015    source источник
comment
Вы указываете числа с предшествующим 0, из-за чего IF ... EQU ... интерпретирует их как восьмеричные числа, а не десятичные. Кроме того, вы должны использовать set /A, способный выполнять математические операции...   -  person aschipfl    schedule 29.07.2015
comment
Обычно, когда мы говорим о секундах и миллисекундах, мы форматируем их как ss.SSS, а не ss:SS.   -  person shoover    schedule 29.07.2015
comment
@aschipfl Итак, как мне решить эту проблему? Я также использую set /a выше.   -  person John Smith    schedule 30.07.2015
comment
@shoover У меня есть причина для особого форматирования, но я понимаю, к чему вы клоните.   -  person John Smith    schedule 30.07.2015
comment
@rojo Как мне вывести это на экран?   -  person John Smith    schedule 30.07.2015
comment
Заключите оба выражения IF ... EQU ... в двойные кавычки, тогда сравнение будет выполнено буквально. Да, вы иногда используете SET /A, но вы также выполняете декременты (-1) в блоках :NumberMods и :BigNumMods с тоннами IF...   -  person aschipfl    schedule 30.07.2015


Ответы (1)


Прошу прощения. Сначала пара комментариев:

  • Я не люблю вопросы, в которых говорится: «Эй, мой код не работает. Пожалуйста, проверьте его и устраните проблему». Вы должны объяснить, что код должен делать и что он делает на самом деле.
  • Я думаю, у вас есть пара путаниц, начиная с «и 00 количество миллисекунд» (миллисекунды имеют 3 цифры, сантисекунды 2). Если вы хотите, чтобы программа обновляла экран как можно быстрее (чтобы показать прошедшие миллисекунды или сантисекунды), зачем вы используете команду ping? Его эффект прямо противоположен желаемому!

В любом случае, если вам нужна более эффективная процедура обратного отсчета в пакетном режиме, попробуйте следующее:

@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» подходит для моего компьютера.

person Aacini    schedule 30.07.2015
comment
Большое спасибо! Извините, я только изучаю пакетный код и действительно был сбит с толку несколькими вещами. Что касается цели кода, он предназначен для обеспечения задержки в 60 секунд, чтобы позволить нескольким свернутым пакетным окнам запускать проверки, которые изменят операции позже в этом сценарии. - person John Smith; 30.07.2015