以batch file打印时间(毫秒)

如何在Windowsbatch file中打印时间(以毫秒为单位)?

我想测量在batch file中行之间传递的时间,但是Windows的“time / T”不打印毫秒。

%time%应该工作,提供足够的时间间隔之间的电话:

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

在我的系统上,我得到以下输出:

6:46:13.50
6:46:13.60

如果你正在做类似的事情

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

要么

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

那么你可以简单地在你的batch file的开头放一个setlocal enabledelayedexpansion并使用!time! 而不是在执行时进行评估的%time% ,而不是parsing行(其中包括括在圆括号中的完整块)。

下面的批次“程序”应该做你想做的。 请注意,它以毫秒为单位输出数据,而不是毫秒。 使用的命令的精确度仅为厘秒。

这是一个输出示例:

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

这是批处理脚本:

 @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%格式为H:MM:SS,午夜后CS,因此转换为厘秒>不起作用。 6:46看到Patrick Cuff的post,似乎不仅仅是我。

但是有了这条线,你应该很容易解决这个问题:

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

谢谢你的不错的灵感! 我喜欢在我的mplayer,ffmpeg,sox脚本中使用它来为了好玩而为旧的PocketPlayers皮条客我的媒体文件。

你必须小心你想做什么,因为这不仅仅是为了得到时间。

该批有内部variables来表示date和时间: %DATE%%TIME% 。 但是它们依赖于Windows Locale。

%date%

  • DD.MM.YYYY
  • DD.MM.YY
  • dMyy
  • DD / MM / YY
  • YYYY-MM-DD

%TIME%

  • H:MM:SS,毫秒
  • HH:MM:SS,毫秒

现在,你的剧本将工作多久,什么时候? 例如,如果它会比一天更长,并且通过午夜,肯定会出错,因为午夜之间两个时间戳的差异是一个负值! 你需要date找出天之间的正确距离,但如果date格式不是一个常数,你怎么做? 如果您继续将其用于math目的,那么包含%DATE%%TIME%的内容可能会更加糟糕。

原因是%DATE%%TIME%是存在的,只是在输出中显示一个date和时间给用户,而不是用来计算。 所以如果你想在一些时间值之间做出正确的距离或者根据date和时间产生一些独特的值,那么你必须使用与%DATE%%TIME%不同并且精确的东西。

我正在使用wmic windows builtin工具来请求这样的东西(把它放在一个脚本文件中):

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

或者在cmd.exe控制台中键入它:

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

这种情况的缺点是频繁拨打电话会造成性能下降。 在我的机器上,每秒钟约12个电话。

如果你想继续使用这个,那么你可以写这样的东西( 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 

现在,你可以在你的脚本中parsing%RETURN_VALUE%

 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%