Как сделать таймер в bat

Засекаем время в bat/cmd

При всех моих стараниях уйти от Windows везде и навсегда не получается. Есть компьютер на работе, компьютеры друзей, собственный нетбук, с которым неохота возиться настолько кардинально. При этом, ряд задач в принципе выполняется из командной строки проще и удобнее, чем «оконно-мышевым» способом. Особенно если это задачи из тех, что имеют прямое отношение к Linux, например, работа с утилитами из комплекта gnuwin32.

Запуская однажды уже упомянутую упаковку/распаковку при помощи windows-реализации tar, я захотел однажды засечь время. Ну, не секундомером же это делать… Сделал командный файл, в котором вывожу время, запускаю архиватор, снова вывожу время.

Получается ерунда. Команда time \t выдает время с точностью до минуты. Ладно, можно использовать переменную среды %time% :

Однако переменная %time% хитроформатированная, скорее текст, чем число, и ее в лоб не получится использовать для вычитания времени начала из времени окончания. Тем более, командный интерпретатор cmd.exe работает с целочисленными значениями, а время идет с точностью до сотых секунды (ну, или до десятков миллисекунд, как хотите).

Ладно, разберем время на составляющие. При помощи конструкции set t1_m=%t1:

3,2% которая присваивает переменной t1_m два знака из t1, пропустив первые три, получим часы, минуты, секунды и сотые доли секунды:

Напоминаю, что ключик /a позволяет оператору set не только присваивать значение переменной, но и выполнять некоторые операции (подробнее — set /? ).

В результате получили в s1 время в сотнях миллисекунд, допустим, из времени начала операции. Можно сделать аналогичным образом s2 из времени окончания. Эти две переменные целочисленные и прекрасно складываются, вычитаются и все такое. Нам надо разность, и, чтобы избежать неожиданностей со знаками, можно сразу определить, что из них больше, и потом вычитать:

Ключик /i расширяет возможности оператора сравнения, позволяя ему не только выполнять сравнение строк на тождественность (чем он занимался изначально), но и сравнивать числа на больше/меньше/равно ( if /? )

Получили s3 — разность времени в десятках миллисекунд. Надо разобрать на составляющие, а потом склеить обратно в удобочитаемом виде. Все несложно, используем остаток от деления, чтобы избавиться, например, от часов при извлечении минут, и деление (целочисленное, другого тут нет), чтобы избавиться от секунд, примерно так:

Тут надо не забыть забавную тонкость: в командном интерпретаторе символ процента — подводный камень. Иногда он ставится по обе стороны от переменной, и тогда при выполнении интерпретатор отбрасывает эту пару, а имя переменной заменяет значением. Иногда он стоит перед переменной цикла. Иногда он используется в виде оператора получения остатка от целочисленного деления. Так вот, там, где процент непарный, его надо не забывать удваивать, а то его отбросят и будут безуспешно искать пару.

Получили часы, минуты, секунды и десятки миллисекунд в отдельных переменных. Можно их использовать, как числа, а можно — как строки, поэтому их легко склеить в одно значение времени и выдать его в стандартный поток ввода-вывода, «на консоль»:

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

и передавать параметры в двойных кавычках (а тильда раскроет кавычки), либо

Итого, получился такой командный файл, скажем, timecalc.bat:

Теперь об использовании. Допустим, есть такой батничек, запускающий архивацию с засечкой времени:

В переменных a и b имеем время начала и окончания операции соответственно. Можно передать их нашему скрипту, непременно валяющемуся тут же рядом, в этой же папке:

И он выведет в консоль затраченное время третьей строчкой, после «start » и «stop ». Но хотелось бы добавить, допустим, «упаковано за » или «распаковано за », так что ввести соответствующие строки в файл «подпрограммы» не получится. Передавать этот строковый «довесок» в виде еще одного параметра и не особо красиво, и при желании дописать текст после времени (а не перед) опять потребует лезть в вызываемый файл. А как перехватить вывод вызываемого файла для использования в вызывающем?

Я просто обалдел, когда узнал. Внезапно, при помощи оператора цикла. О, сколько нам открытий чудных готовит for /? …

Расширение синтаксиса /F позволяет выковыривать переменную цикла из разного рода наборов: файлов, символьных строк, команд. Чтобы понять, что используется для цикла, применяются (или не применяются) кавычки. Без кавычек в скобках пишем файл или набор файлов. А применение кавычек зависит от того, установлена или нет опция usebackq: при установленной в двойных кавычках пишем строку, в простых — команду. При снятой опции строку пишем в простых кавычках, а команду — в обратных (которые обычно на клавише с буквой Ё). При этом, команда вполне может быть одна, и проход цикла тоже один, и в теле цикла получаем нужный нам вывод команды, который засунем в переменную для дальнейшего использования (хотя можно и использовать сразу):

И, кстати, не забываем, что переменная цикла должна быть односимвольной. Нигде этого не прочитал, вывел экспериментально путем ошибок и проб. Может, читал невнимательно, а может, не знал где…

Итого получаем такой командный файл, скажем, tar_time.cmd, который принимает в качестве параметра пакуемую папку, засекает время и пишет его в консоль и в лог-файл:

Аналогичным образом написал почти то же для распаковки, поправив пару строчек.

Возможности команд Windows (тяжелое наследие DOS), конечно, довольно ограничены, но даже с их помощью можно делать интересные и полезные штучки. Вот только иногда фиг догадаешься, описание какой команды для твоей цели нужно смотреть и где именно искать…

Источник

Как сделать таймер в bat

как в камандной строке запустить таймер между командамиВсего записей: 272 | Зарегистр. 16-12-2001 | Отправлено: 08:39 25-03-2004

Akama

Member

Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору напиши софтинку, на любом языке, да включай в батник. я так и сделал. могу поделиться, если нужно очень.
Всего записей: 333 | Зарегистр. 07-04-2002 | Отправлено: 08:43 25-03-2004
BigBear

Как сделать таймер в bat. Смотреть фото Как сделать таймер в bat. Смотреть картинку Как сделать таймер в bat. Картинка про Как сделать таймер в bat. Фото Как сделать таймер в bat

.:МордератоР:.

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору BigBear

Код:

:: 2Kwait.cmd
@echo off
:: Wait %1 seconds

:: setup variables for the batch
setlocal
set vbscript=%temp%\

n0.vbs
set vbrun=cscript /NoLogo «%vbscript%»

:: Continue with script as normal, using «%vbrun% seconds» as often as you like to pause a number of seconds.

:: uncomment next line to delete script when done
del «%vbscript%»

:: Can be moved into path and given a reasonable name to run from any future batch or Windows program.

запуск в виде CALL 2Kwait.cmd 10
можно сразу в виде vbs, но там есть неудобства..

———-
Away/DND
Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 08:59 25-03-2004
BigBear

Member

Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Cheery
Сейчас буду пробовать
Спасибо

Добавлено
все вроде работает
буду ждать падение спулера (а это неизбежно)
там и посмотрим окончательно

Всего записей: 272 | Зарегистр. 16-12-2001 | Отправлено: 09:05 25-03-2004
ZevSforum

Или накрайняк пишем такой mysleep.cmd файлик:

@echo off
echo WScript.sleep(%1); > %temp%\sleep.js
cscript //B %temp%\sleep.js
del /Q %temp%\sleep.js

Как сделать таймер в bat. Смотреть фото Как сделать таймер в bat. Смотреть картинку Как сделать таймер в bat. Картинка про Как сделать таймер в bat. Фото Как сделать таймер в bat

Всего записей: 14 | Зарегистр. 19-03-2004 | Отправлено: 16:18 25-03-2004
BigBear

Member

Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Все работает и самый простой вариант с пингами. и с самописной прогой
тепер время подобрать осталось
Всего записей: 272 | Зарегистр. 16-12-2001 | Отправлено: 08:22 26-03-2004
Aleksanders

Как сделать таймер в bat. Смотреть фото Как сделать таймер в bat. Смотреть картинку Как сделать таймер в bat. Картинка про Как сделать таймер в bat. Фото Как сделать таймер в bat

———-
LINUX = Linux Is Not a UniX
Всего записей: 1420 | Зарегистр. 07-07-2002 | Отправлено: 17:42 26-03-2004
Cheery

Как сделать таймер в bat. Смотреть фото Как сделать таймер в bat. Смотреть картинку Как сделать таймер в bat. Картинка про Как сделать таймер в bat. Фото Как сделать таймер в bat

.:МордератоР:.

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Aleksanders

Цитата:

пишем соответствующий батник и в свойствах сервиса указываем что при ошибке запускать нужный файл

иногда лучше молчать, чем говорить..

———-
Away/DND
Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 01:50 27-03-2004
merlkerry

———-
Вокруг одни враги.
Я испытываю естественный скептицизм по поводу чистоты человеческих намерений.
Всего записей: 1521 | Зарегистр. 16-09-2002 | Отправлено: 15:54 27-03-2004
sayanvd

«. вариант, который работает всегда и со всеми значениями от 1 до 999 секунд:

SetLocal EnableExtensions EnableDelayedExpansion

If «%1″==»» Exit
If %1 LSS 0 GoTo :EOF
If %1 GTR 999 GoTo :EOF

Set pDelay=%1
Set iDelay=0
Set pTime=%Time:

:WAIT
Set iTime=%Time:

7,1%
If %iTime% == %pTime% GoTo :WAIT
Set pTime=%iTime%
Set /a iDelay=%iDelay%+1
If %iDelay% LSS %pDelay% GoTo :WAIT

Источник

Как сделать таймер в bat

Рассмотрим основные варианты организации ожидания ( паузы ) в bat / cmd файлах.

Для решения этой задачи в операционных системах, начиная с VISTA, присутствует команда timeout. Так, для ожидания 10 секунд следует выполнить команду.

Если не использовать параметр /NOBREAK, то ожидание может быть прервано нажатием любой клавиши.

Поскольку эта задача вставала перед разработчиками задолго до появления этой утилиты, те, у которых операционная система младше, могут воспользоваться накопившемся опытом.
Для организации паузы есть специальная утилита, входящая в состав Resource Kit (Ресурскита).
Пакеты Microsoft Windows Deployment Kit и Windows Resource Kit бесплатно распространяется microsoft.com. Этот пакет содержит ряд полезных и. как бы так сказать. других утилит.

Если вы уже устали бродить по бескрайним просторам сайта microsoft.com, постоянно возвращаясь на одни и те же страницы, то можете скачать эту утилиту здесь

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

На просторах интернета можно найти утилиту wait.exe. Точнее, даже несколько разных, включая исходные тексты программы. Поэтому я не привожу здесь параметров вызова, смотрите их описание.

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

В том же пакете Ресурскит есть утилита choice, которую при известной доле извращенности можно использовать для тех же целей:

0,-3% :: пауза на 15 секунд call :sleep 15 :: Другие действия echo Сейчас %time:

0,-3% pause goto :EOF :sleep echo Пауза на %1 секунд. set /a ftime=100%time:

6,-3%%%100+%1 if %ftime% GEQ 60 set /a ftime-=60 :loop set ctime=%time:

6,-3% if /i %ftime% NEQ %ctime% goto :loop exit /b 0

Данная процедура позволит организовать задержку в выполнении. Время ожидания должно быть меньше 60 сек.

Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).

Новый раздел о средствах командной строки в рамках этого же проекта расположен здесь

Источник

Как сделать таймер в bat

Сообщения: 414
Благодарности: 258

vlad_exe@vk, вот готовый скрипт. Но если это для школы, то постарайтесь хотя бы понять логику его работы, чтобы рассказать о ней, когда на уроке информатики или где там это задавали, будут спрашивать. Я бы всё-таки советовал написать самому, используя этот, готовый скрипт в качестве примера, чтобы понять, как он работает.

» width=»100%» style=»BORDER-RIGHT: #719bd9 1px solid; BORDER-LEFT: #719bd9 1px solid; BORDER-BOTTOM: #719bd9 1px solid» cellpadding=»6″ cellspacing=»0″ border=»0″>

Сообщения: 414
Благодарности: 258

» width=»100%» style=»BORDER-RIGHT: #719bd9 1px solid; BORDER-LEFT: #719bd9 1px solid; BORDER-BOTTOM: #719bd9 1px solid» cellpadding=»6″ cellspacing=»0″ border=»0″>

Сообщения: 56
Благодарности: 0

хотя скрипт за все это время проработал не больше 15 мин Как сделать таймер в bat. Смотреть фото Как сделать таймер в bat. Смотреть картинку Как сделать таймер в bat. Картинка про Как сделать таймер в bat. Фото Как сделать таймер в bat

Вот удалил конфиг и запустил по открывал по закрывал всегда Enter`ом и вдруг

Timer: 00:01:30
Last session: 00:10:50
Total: 2 days 00:02:28

Как могло пройти 2 дня ((

Может как то задать чтобы Timer: всегда был 00:00:00 может

Так попробовал после этого баг вроде бы исчез

Источник

Как сделать таймер в bat

Сообщения: 414
Благодарности: 258

vlad_exe@vk, вот готовый скрипт. Но если это для школы, то постарайтесь хотя бы понять логику его работы, чтобы рассказать о ней, когда на уроке информатики или где там это задавали, будут спрашивать. Я бы всё-таки советовал написать самому, используя этот, готовый скрипт в качестве примера, чтобы понять, как он работает.

» width=»100%» style=»BORDER-RIGHT: #719bd9 1px solid; BORDER-LEFT: #719bd9 1px solid; BORDER-BOTTOM: #719bd9 1px solid» cellpadding=»6″ cellspacing=»0″ border=»0″>

Сообщения: 414
Благодарности: 258

» width=»100%» style=»BORDER-RIGHT: #719bd9 1px solid; BORDER-LEFT: #719bd9 1px solid; BORDER-BOTTOM: #719bd9 1px solid» cellpadding=»6″ cellspacing=»0″ border=»0″>

Сообщения: 56
Благодарности: 0

хотя скрипт за все это время проработал не больше 15 мин Как сделать таймер в bat. Смотреть фото Как сделать таймер в bat. Смотреть картинку Как сделать таймер в bat. Картинка про Как сделать таймер в bat. Фото Как сделать таймер в bat

Вот удалил конфиг и запустил по открывал по закрывал всегда Enter`ом и вдруг

Timer: 00:01:30
Last session: 00:10:50
Total: 2 days 00:02:28

Как могло пройти 2 дня ((

Может как то задать чтобы Timer: всегда был 00:00:00 может

Так попробовал после этого баг вроде бы исчез

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *