题
我如何打印的时间(在ms)在一个窗户批文件?
我要测量的时间之间传递线在我的批文件,但Windows的"时间/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%
)
然后您可以在批处理文件的开头简单地添加 setlocal enabledelayedexpansion
,并使用!time!
代替%time%
在执行时得到评估,而不是解析行(包括括在括号中的完整块)。
批次“程序”之下应该做你想做的事。请注意,它以厘秒而不是毫秒输出数据。使用命令的精度只有几厘秒。
以下是输出示例:
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的帖子似乎不仅仅是我。
但是有了这条线,你应该很容易解决这个问题:
if " "=="%StartZeit:~0,1%" set StartZeit=0%StartZeit:~-10%
if " "=="%EndZeit:~0,1%" set EndZeit=0%EndZeit:~-10%
感谢您的灵感!我喜欢在我的mplayer,ffmpeg,sox脚本中使用它来为老式PocketPlayers皮条客我的媒体文件只是为了好玩。
你必须要小心你想要做什么,因为这不仅是对获得的时间。
该批中有的内部的变量来表示的日期和时: %的日期%%的时间%.但是他们依赖于Windows的区域设置。
%的日期%:
- dd.毫米。yyyy
- dd.毫米。yy
- d。M。yy
- dd/MM/yy
- yyyy-MM-dd
%的时间%:
- H:mm:ss,毫秒
- HH:mm:ss,毫秒
现在有多久,你的脚本会工作和什么时候?例如,如果将超过一天,并且通过午夜,肯定会出错的,因为差2之间的时间戳之间的午夜一个负面的价值!你需要的日期,以找出正确之间的距离天,但是你怎么做,如果该日期格式不是一成不变的?事情 %的日期% 和 %的时间% 可能会去还,并还如果你继续使用他们的数学目的。
原因是 %的日期% 和 %的时间% 存在只是显示一个日期和时间用户在的输出,不要把它们用于计算。所以如果你想做正确的距离之间的一些时间值,或者产生一些独特的价值依赖的日期和时间,然后你必须使用不同的东西,比准确的 %的日期% 和 %的时间%.
我使用而使其windows系统的实用要求这样的事情(把它放在一个脚本文件):
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.蝙蝠):
@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%