我在这里找到了这个不错的小代码:https://stackoverflow.com/a/5262637/2128987
@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%)
:TimeThis
robocopy /e /NFL /NDL /NJH /NJS /nc /ns /np folder%rndfolder% %drvltr%:\f%dirnew%\
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.
作为一个独立的程序,它运作良好。我正在使用robocopy命令来确定写入文件所需的时间。
我在其中添加了一个额外的变量,因为我想保留原始秒以进行计算。所以我添加额外的行设置timeraw =%timetaken%:
set /a timetaken= ( %endtime% - %starttime% )
***set timeraw=%timetaken%***
set /a timetakens= %timetaken% / 100
set timetaken=%timetakens%.%timetaken:~-2%
我的批处理文件也使用setlocal enabledelayedexpansion
有时它无法正确计算“starttime”或“endtime”。它将它保留为08:30:22.35类型格式的原始时间,并导致错误:
Invalid number. Numeric constants are either decimal (17),hexadecima (0x11), or octal (021)
很明显,因为它包含非数字字符,例如:character。
我的批处理文件永远连续循环,因为我使用它来读取,写入,删除文件和文件夹以用于特定的酷刑测试条件。
知道为什么它会间歇性地不计算起始时间或结束时间变量吗?
编辑:
我对整个脚本做了一些更改。我不再需要enabledelayedexpansion,清理一些if语句,简化代码。但我偶尔也会得到它,其中starttime或endtime变量仍然是HH:MM:SS.CS的原始时间格式,并导致计算错误。
答案 0 :(得分:0)
旧问题,但可能有一些括号,当您在括号内更改变量时,您需要使用延迟扩展。
运行此并检查差异。
@echo off
set a=nothing
if z==z (
set a=b
echo %a%
)
pause
setlocal enabledelayedexpansion
set a=nothing
if z==z (
set a=b
echo !a!
)
pause
答案 1 :(得分:0)
Gee - 一个近一岁的问题,没有回答。
我认为这个问题现在已经解决了,所以作为记录,我得出的结论是 “有时它没有正确计算”是因为小时/分钟/秒/百分之一将包含“08”或“09”,它们不是八进制数字。
解决方案是
set /a startcsec=1%STARTTIME:~9,2% - 100
并重复其他3个start
时段;然后使用end
部分再次重复。
此外,可能是小时被呈现0被抑制。在这种情况下,我建议
set starttime=0%TIME: =%
set starttime=%startTIME:~-11%
set /a startcsec=1%STARTTIME:~9,2% - 100
其中第一行以“0”为前缀,并将 Space 替换为[nothing]
第二个选择结果的最后11个字符
最后一个是熟悉的表格,使用结果hh:mm:ss.cc
格式。
(显然,子串和计算方法的其余部分也需要实现)