Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Как в .bat сделать секундомер? (http://forum.oszone.net/showthread.php?t=334845)

DenchickDenchick 15-05-2018 14:37 2813798

Как в .bat сделать секундомер?
 
Здравствуйте! Не подскажете как в .bat можно было бы сделать секундомер?
Например мы его открываем и там появляется:

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

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

DenchickDenchick 15-05-2018 14:42 2813799

Я сделал примерный код, но у меня есть проблема - секунды/минуты и тд. после прохождения не обнуляются.
То есть:
Прошло 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 2813840

DenchickDenchick, а) так секундомеры не пишут, б) работать с датой/временем на пакетных файлах можно, но чересчур муторно и ненаглядно.

alpap 16-05-2018 01:02 2813866

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 2813969

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

Elven 16-05-2018 15:12 2813976

Самое забавно начнется когда эта штука заработает. Тогда я предложу заценить разницу между этим "секундометром" и обычным на промежутке времени, например, в сутки.

alpap 16-05-2018 16:08 2813983

Цитата:

Цитата DenchickDenchick
но после повторного прохождения 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, а вот это очень верное верное замечание, если точность нужна как таковая
Цитата:

Цитата Elven
разницу между этим "секундометром" и обычным »


Iska 16-05-2018 23:12 2814091

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

DenchickDenchick 19-05-2018 10:35 2814453

Iska, да так, ради интереса.

megaloman 19-05-2018 10:42 2814455

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 2815061

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


Время: 22:54.

Время: 22:54.
© OSzone.net 2001-