Dos cosas saltan sobre el archivo de proceso original.
pero ninguno de los dos ayudará en el largo plazo.
Sea cual sea su método de referencia, asegúrese de capturar la hora de inicio antes de la operación, y la hora de finalización después de la operación. Tu muestra no hace eso.
%time%
evalúa algo así como "12: 34: 56.78", y el comando SET /A
no puede restar esos. Necesita un comando que produzca una marca de tiempo escalar simple.
que iba a decir que no se puede hacer, pero el lenguaje por lotes es mucho más poderoso de lo que se da el crédito para, asi que aquí hay una implementación sencilla de TIMER.BAT. Para el registro, Pax me adelantó una respuesta que muestra la división de la cadena mientras estaba jugueteando, y Johannes Rössel sugirió trasladar la aritmética fuera de la región medido:
@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
Se podría simplificar la aritmética y ser un poco más Honesto sobre la precisión general de esto al no molestarse con las centésimas de una segunda parte.Aquí está en acción, suponiendo que tiene una orden de suspensión o alguna otra pérdida de tiempo:
C:> TIMER SLEEP 3
Script took 3000 ms to complete
C:>
Editar: revisé el código y su descripción como se sugiere en un comentario.
Creo que cuando el equipo de NT reemplazó COMMAND.COM con CMD.EXE, pensaron que no se saldría con la tarea de hacerlo muy diferente. Pero, en efecto, es casi un lenguaje completamente nuevo. Muchos de los viejos comandos favoritos tienen nuevas características si las extensiones están habilitadas.
Uno de ellos es SETLOCAL
que impide que las variables modifiquen el entorno de la persona que llama. Otro es SET /A
que le da una cantidad notable de aritmética. El truco principal que he usado aquí es la nueva sintaxis de extracción de subcadena donde %t:~3,2%
significa los dos caracteres que comienzan en el desplazamiento 3 en el valor de la variable llamada t
.
Para una sorpresa real, eche un vistazo a la descripción completa del conjunto (intente SET /?
en un aviso) y si eso no lo asusta, mire FOR /?
y observe que puede analizar texto de archivos ...
Edición 2: fijos mal manejo de los campos de tiempo que contienen 08
o 09
reportado por Frankie en los comentarios. Pellizcó un par de cosas y agregó algunos comentarios.
Tenga en cuenta que hay un deslumbramiento evidente que probablemente no voy a solucionar. No funcionará si el comando comienza en un día diferente de lo que termina. Es decir, hará algunas matemáticas relacionadas con la hora del día e informará una diferencia, pero la diferencia no significará mucho.
Arreglarlo para al menos advertir sobre este caso es fácil. Repararlo para hacer lo correcto es más difícil.
Editar 3: Error reparado donde el% h% no está configurado correctamente para horas de un solo dígito. Esto se debe a%% return% "9: 01: 23.45". Observe el espacio. Usar% time: = 0% reemplaza el espacio con un cero inicial y% h% se establecerá correctamente. Este error solo ocurrió cuando un script se ejecutó de una hora a la siguiente.
shouldn' ¿Estableces el tiempo de finalización después de hacer algunas cosas? ¿es un error tipográfico? –
bueno, podría simplemente hacer "time ./myscript" – mpen
@mark, en una instalación estándar de Windows, el tiempo es un comando integrado en CMD.EXE que establece o muestra la hora actual del día. – RBerteig