【问题标题】:Batch script for time measurement not working properly时间测量的批处理脚本无法正常工作
【发布时间】:2013-02-04 01:19:07
【问题描述】:

我正在使用批处理脚本来测量命令的时间。我在 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)

好像错了。

这是什么?

问候, 大卫

【问题讨论】:

    标签: time batch-file measurement


    【解决方案1】:

    问题在于"%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%
    

    (编辑:上面 Andriy M 的更短的方法)


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

    【讨论】:

    • +1,尽管您可以无条件地将其替换为 0,而不是检查是否存在空格:SET "STARTTIME=%STARTTIME: =0%"ENDTIME 相同。那样的话,如果你把它放在计算之前,你可以保持其余的代码不变。
    • 好主意,我编辑了它。我在想前导 0 将指定八进制表示法,这很可能是前面 1 的目的。
    猜你喜欢
    • 2013-03-06
    • 2014-11-05
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多