Question

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 batch, mais le "temps / T" de Windows n'imprime pas les millisecondes.

Était-ce utile?

La solution

% time% devrait fonctionner, à condition qu'un délai suffisant 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, la sortie suivante est générée:

  

6: 46: 13.50
   6: 46: 13.60

Autres conseils

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

Sous le lot " programme " devrait 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
  

% 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 billet de Patrick Cuff à 6h46, il semble que ce ne soit pas seulement moi.

Mais avec ces lignes avant tout, vous devriez régler 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 maquiller mes fichiers média pour d'anciens PocketPlayers juste pour le plaisir.

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

Le lot contient 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% :

  • jj.MM.yyyy
  • jj.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 minuit et 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% pourraient empirer si vous continuez à les utiliser à des fins mathématiques.

La raison en est que les % DATE% et les % TIME% existent uniquement pour afficher une date et une heure pour l'utilisateur dans la sortie, pour ne pas les utiliser pour calculs. Par conséquent, si vous souhaitez définir 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 un autre paramètre et plus précis que % DATE% et % TIME% <. / em>.

J'utilise l'utilitaire intégré de Windows wmic pour demander ce genre de choses (placez-le 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 une performance lente en cas d’appels fréquents. Sur la machine à mine, il y a environ 12 appels par seconde.

Si vous souhaitez 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

Vous pouvez maintenant 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%
scroll top