При всех моих стараниях уйти от 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), конечно, довольно ограничены, но даже с их помощью можно делать интересные и полезные штучки. Вот только иногда фиг догадаешься, описание какой команды для твоей цели нужно смотреть и где именно искать…
как в камандной строке запустить таймер между командами
Всего записей: 272 | Зарегистр. 16-12-2001 | Отправлено:08:39 25-03-2004
Akama
Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору напиши софтинку, на любом языке, да включай в батник. я так и сделал. могу поделиться, если нужно очень.
Всего записей: 333 | Зарегистр. 07-04-2002 | Отправлено:08:43 25-03-2004
:: 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
Всего записей: 14 | Зарегистр. 19-03-2004 | Отправлено:16:18 25-03-2004
BigBear
Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Все работает и самый простой вариант с пингами. и с самописной прогой тепер время подобрать осталось
Всего записей: 272 | Зарегистр. 16-12-2001 | Отправлено:08:22 26-03-2004
Aleksanders
———- LINUX = Linux Is Not a UniX
Всего записей: 1420 | Зарегистр. 07-07-2002 | Отправлено:17:42 26-03-2004
Рассмотрим основные варианты организации ожидания ( паузы ) в 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:
vlad_exe@vk, вот готовый скрипт. Но если это для школы, то постарайтесь хотя бы понять логику его работы, чтобы рассказать о ней, когда на уроке информатики или где там это задавали, будут спрашивать. Я бы всё-таки советовал написать самому, используя этот, готовый скрипт в качестве примера, чтобы понять, как он работает.
хотя скрипт за все это время проработал не больше 15 мин
Вот удалил конфиг и запустил по открывал по закрывал всегда 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, вот готовый скрипт. Но если это для школы, то постарайтесь хотя бы понять логику его работы, чтобы рассказать о ней, когда на уроке информатики или где там это задавали, будут спрашивать. Я бы всё-таки советовал написать самому, используя этот, готовый скрипт в качестве примера, чтобы понять, как он работает.