Il modo più semplice per cronometrare uno strumento da riga di comando


9

Qual è il modo più semplice / veloce per cronometrare uno strumento da riga di comando?

Non deve essere super preciso (+/- secondi va bene) poiché mi aspetto che questo richieda minuti o anche 1 ora +. E anche scrivere un file batch va bene. Inoltre, non è necessario eseguire calcoli in tempo, è sufficiente visualizzare l'ora di inizio e l'ora di fine.


Potrebbe appartenere a StackOverflow.
Joey,

2
Se devo "programmare" qualcosa per farlo funzionare ... la soluzione è troppo complicata. Ci deve essere qualche strumento da riga di comando o una semplice soluzione batch per questo, no?
slolife,

Più probabilmente su Serverfault.
Kirill V. Lyadvinsky,

Generalmente il sistema operativo si preoccupa solo di quanto tempo della CPU ha utilizzato. La mia risposta qui sotto farà quello che vuoi. Uso solo un file di registro per memorizzare le informazioni.
Axxmasterr,

Risposte:


19

Di solito lo sto usando

echo.|time & my_command & echo.|time

quando non ho nient'altro a portata di mano. Ciò provoca un output simile al seguente:

> echo. | time & ping -n 4 localhost> nul & echo. | time
L'ora corrente è: 18: 42: 34,63
Inserisci la nuova ora:
L'ora corrente è: 18: 42: 37,68
Inserisci la nuova ora:

Non carino e può essere reso più bello eseguendo il piping per findstr:

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

Se hai l'espansione ritardata abilitata per impostazione predefinita (o /v:onhai avviato cmd con come argomento) puoi anche semplicemente usare echo !time!senza dover ricorrere a brutti hack con reindirizzamento dell'input.

Se si desidera utilizzare un file batch, è possibile farlo in questo modo:

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

Ho aggiunto il reindirizzamento a zero per stdout e stderr qui, perché altrimenti potrebbe essere difficile trovare le linee di inizio e fine. Puoi rimuoverlo se questo non ti preoccupa.

Ma oggi uso principalmente TimeThis , che ormai è stato rimosso, purtroppo.

PowerShell offre anche un modo:

Measure-Command { my_command }

ma devi fare attenzione alle cose che si basano sulla directory di lavoro o sul reindirizzamento. Perché quelli funzionino correttamente potresti aver bisogno di un piccolo trucco:

@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

Questo può essere eseguito allo stesso modo di timethis, assicurati di sfuggire alle doppie virgolette con \"se sono necessarie nella riga di comando (lo stesso timethispure). L'output prodotto è simile. Tuttavia, i reindirizzamenti non funzioneranno.


TimeThis proviene dal kit di risorse di Windows 2000 e non è più disponibile; nel 2003 Resource Kit è TimeIt, che non ha funzionato sul mio Win7 a 64 bit. Per una soluzione PowerShell vedi superuser.com/questions/228056/…
pesche

Che schifo Tuttavia, ho ancora l'eseguibile che si trova da queste parti.
Joey,

@pesche: ho aggiunto un file batch che può fungere da sostituzione drop-in per timethis.
Joey,

4

È possibile utilizzare l'utilità di pianificazione del sistema per eseguire il comando per l'utente.

Pannello di controllo -> Attività pianificate -> crea nuovo ....

Basta puntare l'attività pianificata al comando che si desidera eseguire e dovrebbe fare quello che si desidera.

Se si desidera creare un file di registro che memorizza le informazioni sullo stato temporale, è possibile prendere in considerazione l'idea di fare qualcosa di simile allo script sopra.

Uso un'utilità chiamata "now" per fare ciò poiché farà eco alla data e all'ora. Questo è molto utile per gli script da riga di comando che si desidera tenere traccia dei file di registro ma non hanno le informazioni utili per includere una data / ora in modo nativo. Molto utile in quanto non si preoccupa di una risposta e scompare quando hai finito.

Ora Utlity può essere trovato qui

L'esempio di script sarebbe ...

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

L'output del campione sarebbe simile

--------------
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

un'altra opzione è quella di utilizzare il timecomando con il /tquale mettere il timeout corrente sulla console (o reindirizzare a un registro) senza richiedere l'ora da impostare. c'è una limitazione in quanto ti darà le ore, i minuti, ma non i secondi e i millisecondi.

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

Sfortunatamente, "time / t" non genera secondi, ma solo "ora: minuti am / pm".
slolife

hai ragione, ho aggiornato la risposta.
Akf

1

Se hai PowerShell, puoi farlo (tutta una riga, suddivisa per leggibilità):

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

Oppure salvalo in un file per un riutilizzo più semplice.

# 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 e 10,2ms usando Ctrl + v dagli appunti


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.