我在下面有这个脚本来跟踪脚本每个部分的处理时间。当我在CMD提示符中运行它时,它运行正常,但是当放入.bat时,它无法运行。这也是由两个IF语句构成的。 还向@driblio喊道,我是从这里得到的。
@echo off
set starttime=%TIME%
set startcsec=%STARTTIME:~9,2%
set startsecs=%STARTTIME:~6,2%
set startmins=%STARTTIME:~3,2%
set starthour=%STARTTIME:~0,2%
set /a starttime=(%starthour%*60*60*100)+(%startmins%*60*100)+(%startsecs%*100)+(%startcsec%)
::Process
set endtime=%time%
set endcsec=%endTIME:~9,2%
set endsecs=%endTIME:~6,2%
set endmins=%endTIME:~3,2%
set endhour=%endTIME:~0,2%
if %endhour% LSS %starthour% set /a endhour+=24
set /a endtime=(%endhour%*60*60*100)+(%endmins%*60*100)+(%endsecs%*100)+(%endcsec%)
set /a timetaken= ( %endtime% - %starttime% )
set /a timetakens= %timetaken% / 100
set timetaken=%timetakens%.%timetaken:~-2%
echo.
echo Took: %timetaken% sec.
答案 0 :(得分:4)
阅读整个 set /?
数字值是十进制数,除非前缀为
0x
十六进制数,八进制数0
。所以0x12
是一样的 因为18
与022
相同。请注意,八进制表示法可以 令人困惑:08
和09
无效数字,因为8
和9
不是有效的八进制数字。
因此echo "%startttime%"
可以返回类似
" 9:08:09.04"
↑↑ invalid in set /a 08
↑↑ invalid in set /a 09
↑↑ valid in set /a 04
使用
@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
set starttime=%TIME%
rem debugging output echo "%starttime%"
set /A startcsec=1%STARTTIME:~9,2% %% 100
set /A startsecs=1%STARTTIME:~6,2% %% 100
set /A startmins=1%STARTTIME:~3,2% %% 100
set starthour=%STARTTIME:~0,2%
set /a starttime=(%starthour%*60*60*100)+(%startmins%*60*100)+(%startsecs%*100)+(%startcsec%)
rem debugging output set start
::Process
:: pause to ensure that endtime >> starttime
pause
set endtime=%time%
rem debugging output echo "%endtime%"
set /A endcsec=1%endTIME:~9,2% %% 100
set /A endsecs=1%endTIME:~6,2% %% 100
set /A endmins=1%endTIME:~3,2% %% 100
set endhour=%endTIME:~0,2%
if %endhour% LSS %starthour% set /a endhour+=24
set /a endtime=(%endhour%*60*60*100)+(%endmins%*60*100)+(%endsecs%*100)+(%endcsec%)
rem debugging output set end
set /a timetaken= ( %endtime% - %starttime% )
set /a timetakens= %timetaken% / 100
set timetaken=%timetakens%.%timetaken:~-2%
echo.
echo Took: %timetaken% sec.
请注意,上面的代码段仍然取决于区域设置和用户首选项。对于区域设置和用户首选项 独立解决方案,请使用wmic os get localdatetime
而不是%time%
的输出,如下所示:
for /F %%G in ('wmic OS get localdatetime /Value ^| find "="') do @set %%G
然后,%localdatetime%
将包含类似20170413030820.447000+120
的内容(固定长度)CIM_DATETIME format yyyymmddHHMMSS.mmmmmmsUUU
,格式中的字段为
yyyy
四位数年份(0000至9999)。您的实施可以限制支持的范围。例如,实现可以 仅支持1980年至2099年。mm
两位数的月份(01到12)。dd
每月两位数的日期(01到31日)。该值必须适合该月份。例如,2月31日无效。 但是,您的实现不必检查有效数据。HH
使用24小时制(00至23)的一天两位数小时。MM
小时内的两位数分钟(00到59)。SS
分钟内的两位数秒(00到59)。mmmmmm
秒中的六位数微秒(000000到999999)。您的实施不必支持 使用此字段进行评估。但是,这个领域必须始终如此 目的是为了保持字符串的固定长度。s
加号(+)或减号( - )表示协调世界时(UTC)的正偏差或负偏差。UUU
三位数偏移量,表示始发时区偏离UTC的分钟数。对于WMI,鼓励, 但不是必需的,将时间转换为GMT(UTC偏移量为零)。