windows 批处理字符串拼接 批处理文件中的打印时间(毫秒)




批处理字符串拼接 (5)

如何在Windows批处理文件中打印时间(以毫秒为单位)?

我想测量批处理文件中行之间的时间,但Windows的“time / T”不会打印毫秒。


%TIME%的格式为H:MM:SS,午夜后CS,因此转换为厘秒>不起作用。 上午6:46看到Patrick Cuff的帖子似乎不仅仅是我。

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

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

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


如果呼叫之间有足够的时间,则%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


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

批处理有内部变量来表示日期和时间: %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,毫秒

现在,您的脚本将运行多长时间? 例如,如果它将超过一天并且经过午夜肯定会出错,因为午夜之间的2个时间戳之间的差异是负值! 您需要日期来找出天之间的正确距离,但如果日期格式不是常数,您将如何做到这一点? 如果您继续将它们用于数学目的,那么%DATE%%TIME%的东西可能会变得越来越糟糕。

原因是%DATE%%TIME%存在只是为了在输出中显示用户的日期和时间,而不是用于计算。 因此,如果您想在某些时间值之间建立正确的距离或根据日期和时间生成一些独特的值,那么您必须使用与%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

现在,您可以在脚本中解析%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%

也许这个工具可以帮忙吗? 它不会返回时间,但它是衡量命令所需时间的好工具。


批量“程序”下面应该做你想要的。 请注意,它以厘秒而不是毫秒输出数据。 使用命令的精度只有几厘秒。

这是一个示例输出:

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