2013-02-04 182 views
1

我正在使用批处理脚本进行时间测量命令。我在StackOverflow上找到了这个脚本。不幸的是,它有时不能正常工作,不幸的是我对批量编程知之甚少。我觉得它有时候有用,有时候不会。也许我在这方面犯错,但看起来它在午夜后不能正常工作。时间测量的批处理脚本无法正常工作

脚本:

@echo off 
setlocal 

rem The format of %TIME% is HH:MM:SS,CS for example 23:59:59,99 
set STARTTIME=%TIME% 

rem here begins the command you want to measure 
dir /s > nul 
rem here ends the command you want to measure 

set ENDTIME=%TIME% 

echo STARTTIME %STARTTIME% 

rem convert STARTTIME and ENDTIME to centiseconds 

set /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%-100)*6000 + (1%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100) 

echo STARTTIME %STARTTIME% 

echo ENDTIME %ENDTIME% 

set /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000 + (1%ENDTIME:~6,2%-100)*100 + (1%ENDTIME:~9,2%-100) 

echo ENDTIME %ENDTIME% 

rem calculating the duration is easy 
set /A DURATION=%ENDTIME%-%STARTTIME% 

rem we might have measured the time inbetween days 
if %ENDTIME% LSS %STARTTIME% set set /A DURATION=%STARTTIME%-%ENDTIME% 

rem outputing 

echo DURATION: %DURATION% in centiseconds 

endlocal 
goto :EOF 

我用它半小时前,我得到了这样的结果:

STARTTIME 1:29:25.17 
STARTTIME 1:29:25.17 
ENDTIME 1:29:27.82 
ENDTIME 1:29:27.82 
DURATION: 1 in centiseconds 

因此,一些与线

set /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%-100)*6000 + (1%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100) 

该行

set /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000 + (1%ENDTIME:~6,2%-100)*100 + (1%ENDTIME:~9,2%-100) 

似乎是错的。

这是什么?

问候, 大卫

回答

3

问题是"%STARTTIME:~0,2%-100"" 1",还有一个额外的空间。该程序然后尝试查找(1 1)而不是(101)的值。

在前面的额外1只应为系统,其输出的时间作为"01:29:25.17"(得到101,而不是01,系统将解释为八进制数),但对于系统,其输出的时间作为" 1:29:25.17"(注的空间在1)的前面有一个问题(这将给1 1)。

一个简单的方法是删除STARTTIME=(1%STARTTIME:~0,2%-100)*360000ENDTIME=(1%ENDTIME:~0,2%-100)*360000中的1,但这可能会导致其他系统出现问题。

更水密的解决办法是REM行之后添加两行:

rem convert STARTTIME and ENDTIME to centiseconds 

set STARTTIME=%STARTTIME: =0% 

set ENDTIME=%ENDTIME: =0% 

(编辑:安德烈·M的短得多的上述方法)


还有两个setif %ENDTIME% LSS %STARTTIME% set set /A DURATION=%STARTTIME%-%ENDTIME%这可能会在尝试测量两天之间的时间时导致问题。

+1

+1,尽管无需检查是否存在空格,您可以无条件替换为'0':'SET'STARTTIME =%STARTTIME:= 0%“',对于'ENDTIME'也是如此。这样,如果您在计算之前立即将其置于计算之前,则可以保持代码的其余部分不变。 –

+0

好主意,我编辑它。我在考虑领导0将指定八进制符号,这很可能是前面1的目的。 – user2033427