Windows命令行在计算时给出错误

时间:2013-03-23 12:37:08

标签: variables command-line cmd

我在这里找到了这个不错的小代码: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的原始时间格式,并导致计算错误。

2 个答案:

答案 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格式。

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