2013-03-23 90 views
0

我发现这个代码可爱的小珍闻这里:https://stackoverflow.com/a/5262637/2128987Windows命令行上计算给错误

@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

好有时不正确地计算“开始时间”或“结束时间”。它保持它在08原时间:30:22.35类型格式和导致错误:

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

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

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

任何想法为什么它会间歇性地不计算starttime或endtime变量?

编辑:

我做了一些改变,以我的整体的脚本。我不再需要enabledelayedexpansion,清理了一些if语句,并简化了一些代码。但是,我仍然偶尔会将起始时间或结束时间变量保留为HH:MM:SS.CS的原始时间格式,并导致计算出错。

+0

任何人都知道为什么它会这样做? – HTWingNut 2013-03-26 21:54:38

回答

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 
0

啧啧 - 一个将近一岁的问题,没有答案。

我假设问题现在已经解决了,所以作为一个记录,我认为 “有时它不能正确计算”是因为小时/分钟/秒/百分之一将包含“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”的时候,并取代空间与[无]
第二选择刚刚过去的11个字符结果
最后是熟悉的形式,使用结果hh:mm:ss.cc格式。

(显然,子串和计算方法的其余部分也需要执行)