La forma más fácil de cronometrar una herramienta de línea de comando


9

¿Cuál es la forma más fácil / rápida de cronometrar una herramienta de línea de comandos?

No tiene que ser súper preciso (+/- segundos está bien) ya que espero que esto tome minutos o incluso 1 hora +. Y escribir un archivo por lotes también está bien. Además, no necesita hacer cálculos a tiempo, solo muestra la hora de inicio y la hora de finalización.


Podría pertenecer a Stackoverflow.
Joey el

2
Si tengo que "programar" algo para que esto funcione ... la solución es demasiado complicada. Debe haber alguna herramienta de línea de comandos o una solución por lotes simple para esto, ¿no?
slolife el

Más probable en Serverfault.
Kirill V. Lyadvinsky el

En general, el sistema operativo solo se preocupa por la cantidad de tiempo de CPU que ha utilizado. Mi respuesta a continuación hará lo que quieras. Solo uso un archivo de registro para almacenar la información.
Axxmasterr

Respuestas:


19

Usualmente estoy usando

echo.|time & my_command & echo.|time

cuando no tengo nada más a la mano. Esto provoca resultados como los siguientes:

> echo. | time & ping -n 4 localhost> nul & echo. | time
La hora actual es: 18: 42: 34,63
Ingrese la nueva hora:
La hora actual es: 18: 42: 37,68
Ingrese la nueva hora:

No es bonito y se puede hacer más bonito canalizando a findtr:

echo.|time|findstr current & ping -n 4 localhost > nul & echo.|time|findstr current

Si tiene la expansión retrasada habilitada de manera predeterminada (o inició cmd /v:oncomo argumento), también puede usarla echo !time!sin tener que recurrir a hacks feos con redirección de entrada.

Si desea utilizar un archivo por lotes, puede hacerlo así:

@echo Start time: %time%
@%*>nul 2>nul
@echo End time: %time%

He agregado la redirección a nul para stdout y stderr aquí, porque de lo contrario podría ser difícil encontrar las líneas de inicio y final. Puede eliminar esto si esto no le preocupa.

Pero hoy en día uso principalmente TimeThis , que por ahora fue eliminado, lamentablemente.

PowerShell también ofrece una manera:

Measure-Command { my_command }

pero debe tener cuidado con las cosas que dependen del directorio de trabajo o la redirección. Para que funcionen correctamente, es posible que necesite un pequeño truco:

@echo off
setlocal enableextensions

rem Prepare current directory and command line so they
rem can be stuck into a single-quoted PowerShell string.
set "Dir=%CD:'=''%"
set "Cmd=%*"
set "Cmd=%Cmd:'=''%"

rem Prepare command to pass to PowerShell
set Command=
set "Command=&{"
set "Command=%Command%  Set-Location '%Dir%'"
set "Command=%Command%; [Environment]::CurrentDirectory = '%Dir%'"
set "Command=%Command%; $start = Get-Date"
set "Command=%Command%; Write-Host '    Command line : %Cmd%'"
set "Command=%Command%; Write-Host ('    Start time   : ' + $start.ToString())"
set "Command=%Command%; Write-Host"
set "Command=%Command%; iex 'cmd /c %Cmd%'"
set "Command=%Command%; $end = Get-Date"
set "Command=%Command%; Write-Host"
set "Command=%Command%; Write-Host '    Command line : %Cmd%'"
set "Command=%Command%; Write-Host ('    Start time   : ' + $start.ToString())"
set "Command=%Command%; Write-Host ('    End time     : ' + $end.ToString())"
set "Command=%Command%; Write-Host ('    Elapsed time : ' + ($end - $start).ToString())"
set "Command=%Command%; }"

powershell -noprofile -command "%Command%"

endlocal

Esto se puede ejecutar de la misma manera que timethis, asegúrese de escapar de las comillas dobles \"si son necesarias en la línea de comando (igual timethisque también). La salida producida es similar. Sin embargo, las redirecciones no funcionarán.


TimeThis es del kit de recursos de Windows 2000 y ya no está disponible; en 2003, Resource Kit es TimeIt, que no funcionaba en mi Win7 de 64 bits. Para una solución de PowerShell ver superuser.com/questions/228056/...
pesche

Eso apesta. Sin embargo, todavía tengo el ejecutable por aquí desde los viejos tiempos.
Joey

@pesche: agregué un archivo por lotes que puede actuar como un reemplazo directo timethis.
Joey

4

Puede usar el programador del sistema para ejecutar el comando por usted.

Panel de control -> Tareas programadas -> crear nuevo ....

Simplemente apunte la tarea programada al comando que desea ejecutar y debería hacer lo que desea.

Si desea crear un archivo de registro que almacene información sobre el estado del tiempo, puede considerar hacer algo similar al script anterior.

Utilizo una utilidad llamada "ahora" para hacer esto, ya que repetirá la fecha y la hora. Esto es muy útil para los scripts de línea de comandos que desea realizar un seguimiento de los archivos de registro, pero carece de la inteligencia para incluir una fecha / hora de forma nativa. Muy útil ya que no le importa una respuesta y desaparece cuando haya terminado.

Ahora Utlity se puede encontrar aquí

El ejemplo del script sería ...

echo -------------- >>logfile.txt
now Process Starting>> logfile.txt
<commandhere> <target> >> logfile.txt
now process Ending >> logfile.txt
echo -------------- >> logfile.txt

La salida de muestra se vería así

--------------
Mon Mar 06 14:58:48 2009 Process Starting
GNU Super Duper Process PID 12345! Success
Mon Mar 06 21:47:01 2009 Process Ending
--------------

4

otra opción es usar el timecomando con el /tcual se pondrá el tiempo actual en la consola (o se redireccionará a un registro) sin solicitar el tiempo que se establecerá. Hay una limitación en que le dará las horas, minutos, pero no segundos y milisegundos.

call time /t  > myLog.log
call mybat   >> myLog.log
call time /t >> myLog.log

Desafortunadamente, "time / t" no genera segundos, solo "hora: minuto am / pm".
slolife el

tienes razón, he actualizado la respuesta.
akf

1

Si tiene PowerShell, puede hacer esto (una sola línea, dividida para facilitar la lectura):

PS C:\> $startTime=Get-Date;ping /n 4 localhost;$endTime=Get-Date;
        echo "Finished in $(($endTime-$startTime).ToString())"

O guarde esto en un archivo para una reutilización más fácil.

# usage: .\timer.ps1 program [arguments]

$startTime = Get-Date;
$prog = $args[0];
$progargs = $args[1..($args.length-1)];

&$prog $progargs

$endTime = Get-Date;

echo "Finished in $(($endTime - $startTime).ToString())";

1
In command prompt:
 wmic path win32_operatingsystem get LocalDateTime
 wmic path win32_operatingsystem get LocalDateTime
 wmic path win32_operatingsystem get LocalDateTime

Output:
C:\Users\Steini> wmic path win32_operatingsystem get LocalDateTime
LocalDateTime
20180113135409.370000+000

C:\Users\Steini>wmic path win32_operatingsystem get LocalDateTime
LocalDateTime
20180113135409.525000+000

C:\Users\Steini>wmic path win32_operatingsystem get LocalDateTime
LocalDateTime
20180113135409.627000+000

15,5ms y 10,2ms usando Ctrl + v desde el portapapeles


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.