В исходном пакетном файле выпрыгивают две вещи. , но ни один из них не поможет в долгосрочной перспективе.
Каким бы ни был ваш метод тестирования, обязательно запишите время начала до операции и время окончания после операции. Ваш образец не делает этого.
%time%
оценивается как «12: 34: 56.78», и команда SET /A
не может их вычесть. Вам нужна команда, которая производит простую скалярную метку времени.
Я собирался сказать, что это невозможно, но пакетный язык намного мощнее, чем его считают, так что здесь есть простая реализация TIMER.BAT. Для протокола, Пакс избил меня до ответа, показывающего расщепление струны, пока я возился, и Йоханнес Рессел предложил переместить арифметику за пределы измеряемой области:
@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
Вы могли бы упростить арифметику и быть немного более честным в отношении общей точности этого, не беспокоясь о сотых долях второй части. Вот он в действии, при условии, что у вас есть команда сна или какой-то другой тратит время:
C:> TIMER SLEEP 3
Script took 3000 ms to complete
C:>
Редактировать: Я изменил код и его описание, как это предлагается в комментарии.
Я думаю, что когда команда NT заменила COMMAND.COM на CMD.EXE, они подумали, что им не удастся сделать его совсем другим. Но на самом деле это почти совершенно новый язык. Многие из старых любимых команд имеют новые функции, если расширения включены.
Одним из них является SETLOCAL
, который не позволяет переменным изменять среду вызывающего. Другой - SET /A
, который дает вам замечательное количество арифметики. Принцип, который я использовал здесь, - это новый синтаксис извлечения подстрок, где %t:~3,2%
означает два символа, начинающиеся со смещения 3 в значении переменной с именем t
.
Для настоящего шокера взгляните на полное описание набора (попробуйте SET /?
в приглашении), и если вас это не пугает, посмотрите на FOR /?
и обратите внимание, что он может анализировать текст из файлов. ...
Редактировать 2: Исправлена неправильная обработка полей времени, содержащих 08
или 09
, о которых сообщил Фрэнки в комментариях. Подправил пару вещей и добавил несколько комментариев.
Обратите внимание, что здесь есть явный недосмотр, который я, вероятно, не собираюсь исправлять. Это не будет работать, если команда начинается в другой день, чем она заканчивается. То есть он будет выполнять некоторые математические операции, связанные со временем суток, и сообщать о разнице, но разница не будет много значить.
Исправить это, по крайней мере, предупредить об этом случае легко. Исправить это, чтобы сделать правильные вещи сложнее.
Редактировать 3: Исправлена ошибка, при которой% h% не был установлен правильно для однозначных часов. Это связано с тем, что% time% возвращает «9: 01: 23.45». Обратите внимание на пространство. Использование% time: = 0% заменяет пробел на начальный ноль, и% h% будет установлен правильно. Эта ошибка возникала только в том случае, если сценарий выполнялся с одного однозначного часа до следующего.