65 votes

Temps d'impression dans un fichier batch (millisecondes)

Comment imprimer le temps (en ms) dans un fichier batch Windows ?

Je veux mesurer le temps qui s'écoule entre les lignes de mon fichier batch, mais la commande "time /T" de Windows n'imprime pas les millisecondes.

0 votes

102voto

Patrick Cuff Points 13362

%time% devrait fonctionner, à condition que suffisamment de temps se soit écoulé entre les appels :

@echo OFF

@echo %time%
ping -n 1 -w 1 127.0.0.1 1>nul
@echo %time%

Sur mon système, j'obtiens le résultat suivant :

6:46:13.50
6:46:13.60

7 votes

Sur mon ordinateur, il affiche la même heure, même si je dors entre deux appels.

0 votes

Pouvez-vous afficher le code du fichier batch que vous essayez de profiler ?

11 votes

J'en doute :) Quel était le problème ? Le fait de le partager ici aiderait-il d'autres personnes qui rencontrent le même problème ?

36voto

Joey Points 148544

Si vous faites quelque chose comme

for /l %%i in (1,1,500) do @echo %time%

ou

if foo (
    echo %time%
    do_something
    echo %time%
)

alors vous pourriez simplement mettre un setlocal enabledelayedexpansion au début de votre fichier batch et utilisez !time! au lieu de %time% qui est évalué lors de l'exécution, et non lors de l'analyse de la ligne (qui comprend des blocs complets entre parenthèses).

27voto

nusi Points 730

Le "programme" batch ci-dessous devrait faire ce que vous voulez. Veuillez noter que les données sont exprimées en centisecondes et non en millisecondes. La précision des commandes utilisées n'est que de quelques centisecondes.

Voici un exemple de sortie :

STARTTIME: 13:42:52,25
ENDTIME: 13:42:56,51
STARTTIME: 4937225 centiseconds
ENDTIME: 4937651 centiseconds
DURATION: 426 in centiseconds
00:00:04,26

Voici le lot script :

@echo off
setlocal

rem The format of %TIME% is HH:MM:SS,CS for example 23:59:59,99
set STARTTIME=%TIME%

rem here begins the command you want to measure
dir /s > nul
rem here ends the command you want to measure

set ENDTIME=%TIME%

rem output as time
echo STARTTIME: %STARTTIME%
echo ENDTIME: %ENDTIME%

rem convert STARTTIME and ENDTIME to centiseconds
set /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%-100)*6000 + (1%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100)
set /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000 + (1%ENDTIME:~6,2%-100)*100 + (1%ENDTIME:~9,2%-100)

rem calculating the duratyion is easy
set /A DURATION=%ENDTIME%-%STARTTIME%

rem we might have measured the time inbetween days
if %ENDTIME% LSS %STARTTIME% set set /A DURATION=%STARTTIME%-%ENDTIME%

rem now break the centiseconds down to hors, minutes, seconds and the remaining centiseconds
set /A DURATIONH=%DURATION% / 360000
set /A DURATIONM=(%DURATION% - %DURATIONH%*360000) / 6000
set /A DURATIONS=(%DURATION% - %DURATIONH%*360000 - %DURATIONM%*6000) / 100
set /A DURATIONHS=(%DURATION% - %DURATIONH%*360000 - %DURATIONM%*6000 - %DURATIONS%*100)

rem some formatting
if %DURATIONH% LSS 10 set DURATIONH=0%DURATIONH%
if %DURATIONM% LSS 10 set DURATIONM=0%DURATIONM%
if %DURATIONS% LSS 10 set DURATIONS=0%DURATIONS%
if %DURATIONHS% LSS 10 set DURATIONHS=0%DURATIONHS%

rem outputing
echo STARTTIME: %STARTTIME% centiseconds
echo ENDTIME: %ENDTIME% centiseconds
echo DURATION: %DURATION% in centiseconds
echo %DURATIONH%:%DURATIONM%:%DURATIONS%,%DURATIONHS%

endlocal
goto :EOF

2 votes

%TIME% est dans le format H:MM:SS,CS après minuit et donc la conversion en centisecondes ne fonctionne pas. En voyant le message de Patrick Cuff à 6:46am, il semble que ce ne soit pas seulement moi.

0 votes

Le (1%STARTTIME:~6,2%-100)*100 devrait être (1%STARTTIME:~6,2%-100)*1000 etc.

0 votes

Le (1%STARTTIME:~9,2%-100) devrait être (1%STARTTIME:~9,2%-100) * 10, etc.

3voto

Stefan Points 29091

Peut-être cet outil ( version archivée ) pourrait vous aider ? Il ne renvoie pas le temps, mais c'est un bon outil pour mesurer le temps que prend une commande.

0 votes

Merci, +1 utile. Mais il est toujours intéressant de savoir pourquoi il n'y a pas d'impression simple de l'heure dans le lot...

4 votes

J'aime cette suggestion. Malheureusement, sans le nom de l'outil, lorsque le lien est rompu (par exemple maintenant), je ne peux pas voir de quoi vous parlez.

4 votes

I piense en ça aurait pu être timethis.exe (qui, au moment de la rédaction de cet article, semble être disponible via ce lien .

2voto

Mae Points 1

%TIME% est dans le format H:MM:SS,CS après minuit et donc la conversion en centisecondes >ne fonctionne pas. En voyant le message de Patrick Cuff à 6:46am, il semble que ce ne soit pas seulement moi.

Mais avec ces lignes, vous devriez résoudre ce problème facilement :

if " "=="%StartZeit:~0,1%" set StartZeit=0%StartZeit:~-10%
if " "=="%EndZeit:~0,1%" set EndZeit=0%EndZeit:~-10%

Merci pour votre belle inspiration ! J'aime l'utiliser dans mes mplayer, ffmpeg, sox scripts pour pimper mes mediafiles pour les vieux PocketPlayers juste pour le plaisir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X