web-dev-qa-db-fra.com

Temps d'impression dans un fichier de traitement par lots (millisecondes)

Comment imprimer l'heure (en ms) dans un fichier batch Windows?

Je souhaite mesurer le temps qui s'écoule entre les lignes de mon fichier de commandes, mais le "temps/T" de Windows n'imprime pas des millisecondes.

58
Assaf Lavie

%time% devrait fonctionner, à condition qu'il se soit écoulé assez de temps 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 la sortie suivante:

6: 46: 13.50
6: 46: 13.60

96
Patrick Cuff

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 de commandes et utilisez !time! au lieu de %time% qui est évalué à l'exécution, pas à l'analyse de la ligne (qui inclut les blocs complets entre parenthèses).

35
Joey

Le "programme" ci-dessous doit faire ce que vous voulez. Veuillez noter qu'il génère les données en centisecondes au lieu de millisecondes. La précision des commandes utilisées n'est que de 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 script batch:

@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
25
nusi

Peut-être que cet outil pourrait aider? Il ne renvoie pas l'heure, mais c'est un bon outil pour mesurer le temps que prend une commande.

2
Stefan

Vous devez faire attention à ce que vous voulez faire, car il ne s'agit pas simplement d'obtenir le temps.

Le lot a des variables internes pour représenter la date et l'heure: % DATE%% TIME%. Mais ils dépendent des paramètres régionaux de Windows.

% Date%:

  • dd.MM.yyyy
  • dd.MM.yy
  • d.M.yy
  • jj/mm/aa
  • aaaa-MM-jj

% TIME%:

  • H: mm: ss, msec
  • HH: mm: ss, msec

Maintenant, combien de temps votre script fonctionnera et quand? Par exemple, si la durée dépasse un jour et dépasse le minuit, cela ne va pas du tout, car la différence entre 2 horodatages entre un minuit est une valeur négative! Vous avez besoin de la date pour déterminer la distance correcte entre les jours, mais comment procéder si le format de la date n'est pas une constante? Les objets avec % DATE% et % TIME% risquent de s'aggraver si vous continuez à les utiliser à des fins de calcul.

La raison en est % DATE% et % TIME% existent uniquement pour indiquer une date et une heure à l'utilisateur dans la sortie, et non pour les utiliser pour des calculs. Donc, si vous voulez établir une distance correcte entre certaines valeurs de temps ou générer une valeur unique en fonction de la date et de l’heure, vous devez utiliser quelque chose de différent et de plus précis que % DATE% et % TIME%)..

J'utilise l'utilitaire intégré de Windows wmic pour demander de telles choses (mettez-les dans un fichier script):

for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE`) do if "%%i" == "LocalDateTime" echo.%%j

ou tapez-le dans la console cmd.exe:

for /F "usebackq tokens=1,2 delims==" %i in (`wmic os get LocalDateTime /VALUE`) do @if "%i" == "LocalDateTime" echo.%j

L'inconvénient est que les performances sont lentes en cas d'appels fréquents. Sur la machine à mine, il y a environ 12 appels par seconde.

Si vous voulez continuer à utiliser ceci, vous pouvez écrire quelque chose comme ceci (get_datetime.bat):

@echo off

rem Description:
rem   Independent to Windows locale date/time request.

rem Drop last error level
cd .

rem drop return value
set "RETURN_VALUE="

for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if "%%i" == "LocalDateTime" set "RETURN_VALUE=%%j"

if not "%RETURN_VALUE%" == "" (
  set "RETURN_VALUE=%RETURN_VALUE:~0,18%"
  exit /b 0
)

exit /b 1

Maintenant, vous pouvez analyser % RETURN_VALUE% dans votre script:

call get_datetime.bat
set "FILE_SUFFIX=%RETURN_VALUE:.=_%"
set "FILE_SUFFIX=%FILE_SUFFIX:~8,2%_%FILE_SUFFIX:~10,2%_%FILE_SUFFIX:~12,6%"
echo.%FILE_SUFFIX%
2
Andry

% TIME% est au format H: MM: SS, CS après minuit et, par conséquent, la conversion en centisecondes> ne fonctionne pas. En voyant le post de Patrick Cuff à 6h46, il semble que ce ne soit pas seulement moi.

Mais avec ces lignes avant 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 scripts mplayer, ffmpeg, sox pour maquer mes fichiers média pour d'anciens PocketPlayers juste pour le fun.

2
Mae