Две вещи выходят из-под оригинального командного файла.
, но ни один из них не поможет в долгосрочной перспективе.
Независимо от метода тестов, убедитесь, чтобы захватить время начала до того операции, и время окончания после операции. Ваш образец этого не делает.
%time%
оценивает что-то вроде «12: 34: 56.78», а команда SET /A
не может вычитать их. Вам нужна команда, которая создает простую скалярную метку времени.
Я собирался сказать, что это не может быть сделано, но партия язык является гораздо более мощным, чем это дается кредит, так вот простая реализация TIMER.BAT. Для записи, Pax бить меня в ответ, показывая строковое расщепление пока я возился вокруг, и Johannes Rössel предложил переместить арифметику вне измеренной области:
@echo off
setlocal
rem Remeber start time. Note that we don't look at the date, so this
rem calculation won't work right if the program run spans local midnight.
set t0=%time: =0%
rem do something here.... but probably with more care about quoting.
rem specifically, odd things will happen if any arguments contain
rem precent signs or carets and there may be no way to prevent it.
%*
rem Capture the end time before doing anything else
set t=%time: =0%
rem make t0 into a scaler in 100ths of a second, being careful not
rem to let SET/A misinterpret 08 and 09 as octal
set /a h=1%t0:~0,2%-100
set /a m=1%t0:~3,2%-100
set /a s=1%t0:~6,2%-100
set /a c=1%t0:~9,2%-100
set /a starttime = %h% * 360000 + %m% * 6000 + 100 * %s% + %c%
rem make t into a scaler in 100ths of a second
set /a h=1%t:~0,2%-100
set /a m=1%t:~3,2%-100
set /a s=1%t:~6,2%-100
set /a c=1%t:~9,2%-100
set /a endtime = %h% * 360000 + %m% * 6000 + 100 * %s% + %c%
rem runtime in 100ths is now just end - start
set /a runtime = %endtime% - %starttime%
set runtime = %s%.%c%
echo Started at %t0%
echo Ran for %runtime%0 ms
Вы можете упростить арифметику и быть немного больше честный об общей точности этого, не беспокоясь о 100-й части второй части.Здесь в действии, если у вас есть команда сна или в другое время расточитель:
C:> TIMER SLEEP 3
Script took 3000 ms to complete
C:>
Edit: я пересмотрел код и его описание, как это предлагается в комментарии.
Я думаю, что, когда команда NT заменила COMMAND.COM на CMD.EXE, они думали, что они не уйдут, сделав ее совсем другой. Но на самом деле это почти совершенно новый язык. Многие из старых любимых команд имеют новые функции, если расширения включены.
Один из них - SETLOCAL
, который мешает переменным изменять среду звонящего. Другой - SET /A
, который дает вам замечательное количество арифметики. Основной трюк, который я использовал здесь, - это новый синтаксис извлечения подстроки, где %t:~3,2%
означает два символа, начинающихся со смещения 3, в значении переменной с именем t
.
Для настоящего шокера взгляните на полное описание набора (попробуйте SET /?
в командной строке), и если это вас не пугает, посмотрите на FOR /?
и обратите внимание, что он может анализировать текст из файлов ...
Edit 2: Фиксированных неправильное обращение времени полей, содержащих 08
или 09
сообщенных Фрэнки в комментариях. Изменил пару вещей и добавил некоторые комментарии.
Обратите внимание, что здесь существует явный надзор, который я, вероятно, не собираюсь исправлять. Он не будет работать, если команда запускается в другой день, чем заканчивается. То есть, он будет делать некоторую математику, связанную со временем дня, и сообщать о различии, но разница не будет значить много.
Фиксация его, по крайней мере, предупреждает об этом случае. Фиксировать его, чтобы делать правильные вещи, сложнее.
Редактировать 3: Исправлена ошибка, при которой% h% не устанавливается должным образом для однократных часов. Это связано с тем, что% time% возвращает «9: 01: 23.45». Обратите внимание на пробел. Использование% time: = 0% заменяет пространство начальным нулем и% h% будет установлено правильно. Эта ошибка произошла только в том случае, если сценарий работал от одной цифры до следующего.
не должны» t вы устанавливаете время окончания после того, как делаете что-то? это опечатка? –
ну, вы могли бы просто сделать «время ./myscript» – mpen
@mark, на складе Установка Windows, время - это команда, встроенная в CMD.EXE, которая устанавливает или отображает текущее время суток. – RBerteig