Войти

Показать полную графическую версию : Как в .bat сделать секундомер?


DenchickDenchick
15-05-2018, 14:37
Здравствуйте! Не подскажете как в .bat можно было бы сделать секундомер?
Например мы его открываем и там появляется:

Прошло 0 дн. 13ч. 11мин. 5сек.

Чтобы считал после открытия

DenchickDenchick
15-05-2018, 14:42
Я сделал примерный код, но у меня есть проблема - секунды/минуты и тд. после прохождения не обнуляются.
То есть:
Прошло 179346 сек. 2989,1 мин. 49,8 ч. 2 дн.
Я хотел бы сделать так чтобы после прохождения 60сек. они обнулялись и начинали сначала "1 2 3 4", при этом переходя в минуты.
Вот мой код:

@echo off
set var=peremenna9
set /a var=1
goto st
:loop
ping -n 2 127.0.0.1 > nul
:st
title Счётчик работает %var% сек
cls
Echo.
Echo.
Echo.
Echo (пк)Счётчик работает %var%сек. %mn% мин. %ho%ч. %dn%дн.
set /a var+=1
set /a mn=%var%/60
set /a ho=%mn%/60
set /a dn=%ho%/24
color e
goto loop

Iska
15-05-2018, 20:46
DenchickDenchick, а) так секундомеры не пишут, б) работать с датой/временем на пакетных файлах можно, но чересчур муторно и ненаглядно.

alpap
16-05-2018, 01:02
DenchickDenchick, только получается программу написать хотели вы, а написал ее вместо вас я, типа украл идею.

@echo off
set /a "ss=0,mm=0,hh=0,dd=0"

:s
>nul ping -n 2 127.0.0.1& set /a ss+=1
if %ss%==60 set /a "mm=ss/60,hh=ss/3600,dd=ss/86400,ss=0"
echo Счётчик работает: %ss% сек,%mm% мин,%hh% час,%dd% дн
goto s
pause

DenchickDenchick
16-05-2018, 14:50
alpap, спасибо за помощь, но здесь что-то немного не так. Скорее всего я не совсем верно сформулировал свой вопрос :dont-know
После прохождения 60 сек он переходит в 1 мин, но после повторного прохождения 60 сек далее не прибавляются минуты, часы, дни и так далее.

Elven
16-05-2018, 15:12
Самое забавно начнется когда эта штука заработает. Тогда я предложу заценить разницу между этим "секундометром" и обычным на промежутке времени, например, в сутки.

alpap
16-05-2018, 16:08
но после повторного прохождения 60 сек »
да, извиняюсь, это мой косяк, исправил:

@echo off
set /a "ss=0,mm=0,hh=0,dd=0"

:s
>nul ping -n 2 127.0.0.1& set /a ss+=1
if %ss%==60 set /a mm+=1,ss=0
if %mm%==60 set /a hh+=1,mm=0
if %hh%==24 set /a dd+=1,hh=0
if %dd%==365 echo Процессор сдох& pause
echo Счётчик работает: %ss% сек,%mm% мин,%hh% час,%dd% дн
goto s
pause

DenchickDenchick, а вот это очень верное верное замечание, если точность нужна как таковая
разницу между этим "секундометром" и обычным »

Iska
16-05-2018, 23:12
Я лично вообще не понимаю, в чём смысл авторского видения вопроса. Во-первых, как уже было неоднократно сказано, код считает не секунды, а время исполнения утилиты ping.exe. Во-вторых, ничего ценного и полезного, окромя вышеуказанного, код не делает (и не может делать в принципе). Так что на самом деле было нужно?

DenchickDenchick
19-05-2018, 10:35
Iska, да так, ради интереса.

megaloman
19-05-2018, 10:42
DenchickDenchick, @Echo Off
cls

Set /A Days=0

Set "T00=%Time%"
Call :TtoN "%T00%" "N0"
Set "D0=%Date%"
Set "D00=%D0%"

:Begin
Call :TtoN "%Time%" "Nt"
If Not "%Date%"=="%D0%" (Set "D0=%Date%" &Set /A Days=%Days%+86400)
Set /A Nt=Nt+%Days%-%N0%
Call :NtoT %Nt% "DD" "HH" "MM" "SS"
cls
Echo Прошло DD:HH:MM:SS=%DD%:%HH%:%MM%:%SS% с момента %D00% %T00:~0,-3%
TimeOut /T 1 >nul
GoTo :Begin
GoTo :Eof

:TtoN
SetLocal &Set "tt=%~1"
Set "tt=%tt: =0%"
Set /A tt=1%tt:~6,2%-100+(1%tt:~3,2%-100)*60+(1%tt:~0,2%-100)*3600
EndLocal &Set "%~2=%tt%"
GoTo :Eof

:NtoT
SetLocal
Set /A tt2=%1/86400+100
Set /A tt3=(%1-(%tt2%-100)*86400)/3600+100
Set /A tt4=(%1-(%tt2%-100)*86400-(%tt3%-100)*3600)/60+100
Set /A tt5=(%1-(%tt2%-100)*86400-(%tt3%-100)*3600-(%tt4%-100)*60)+100
EndLocal &Set "%~2=%tt2:~1,2%" &Set "%~3=%tt3:~1,2%" &Set "%~4=%tt4:~1,2%" &Set "%~5=%tt5:~1,2%"
GoTo :Eof

Если в системе есть команда Timeout (в Win 7 она имеется, проверьте, сделайте в командном окне timeout /?), то после Echo можно вставить команду
TimeOut /T 1 >nul
Это снизит дурную нагрузку на процессор, но, возможно, некоторое значение секунд при отображении будет пропущено. Но накопление погрешности отображения секунд в случае, как это было у alpap, не будет Как это работает: берётся разница во времени от команды Time при запуске и далее эта команда выполняется каждый раз, когда надо посчитать разность. Значения time (часы, минуты, секунды) сводятся к секундам, затем разница пересчитывается в дни:часы:минуты:секунды

c4uran
23-05-2018, 12:10
Думаю высшей стадией этого приложения если оно еще и считало погрешность, сделать это можно путем добавления в цикл еще одного секундомера только считающего не от нуля, а от текущего времени, далее сравнивало внутренние часы с оригинальным временем и при выявлении погрешности отнимало нужное время от секундомера... Да и для корректного отображения русских букв хорошо бы добавить изменение кодировки в начало скрипта




© OSzone.net 2001-2012