0

我在这里找到了这个不错的小代码: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 命令一起使用来确定写入文件需要多长时间。

我在其中添加了一个额外的变量,因为我想保留原始秒数以用于计算目的。所以我添加了额外的行 set timeraw=%timetaken%:

set /a timetaken= ( %endtime% - %starttime% )
***set timeraw=%timetaken%***
set /a timetakens= %timetaken% / 100
set timetaken=%timetakens%.%timetaken:~-2%

我的批处理文件也使用 setlocal enabledelayedexpansion

好吧,有时它不能正确计算“开始时间”或“结束时间”。它将其保留为 08:30:22.35 类型格式的原始时间并导致错误:

Invalid number. Numeric constants are either decimal (17),hexadecima (0x11), or octal (021)

很明显,因为它包含非数字字符,例如 : 字符。

我的批处理文件永远处于连续循环中,因为我使用它来读取、写入、删除特定酷刑测试条件的文件和文件夹。

知道为什么它会间歇性地不计算 starttime 或 endtime 变量吗?

编辑:

我对我的整体脚本进行了一些更改。我不再需要 enableelayedexpansion,清理了一些 if then 语句,并稍微简化了代码。但我仍然偶尔会在 starttime 或 endtime 变量保持为 HH:MM:SS.CS 的原始时间格式并导致计算错误的地方得到它。

4

2 回答 2

0

哎呀 - 一个将近一年的问题,没有答案。

我假设问题现在已经解决了,所以作为记录,我会得出结论,“有时它不能正确计算”是因为小时/分钟/秒/百分之几将包含“08”或“ 09" 不是八进制数。

解决方案是

set /a startcsec=1%STARTTIME:~9,2% - 100

start并与其他 3 个时间段中的每一个重复;然后再次重复这些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格式。

(显然,substring-and-calculate 方法的其余部分也需要实现)

于 2014-02-20T08:43:58.770 回答
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
于 2014-02-20T08:03:48.883 回答