批处理文件 IF 语句所用时间

批处理文件 IF 语句所用时间

我正在尝试编写一个批处理文件,将命令所用的时间转换为小时、分钟和秒。

以下是我得到的信息:

@echo off

set /a sec=0
set /a min=0
set /a hrs=0
for /f %%G in ('ping localhost -n 100 >nul') do (
    ping localhost -n 1 >nul
    set /a sec+=1
    if %sec%==60 ( 
        set /a min+=1
        set /a sec=0
    )
    if %min%==60 (
        set /a hrs+=1
        set /a min=0
    ) 
)
echo Time taken: %hrs%:%min%:%sec%.

我不断收到“) 此时是意外的。”错误。 FOR 循环肯定有效,问题只是出在 IF 语句上。

我尝试使用 EQU 运算符并添加引号,但无济于事。有人能帮忙吗?

另外,我在某处读到集合运算符可能在 IF 语句下不起作用 - 这是真的吗?

答案1

语法错误是由于 FOR IN() 子句中的未转义重定向造成的。以下操作将消除语法错误:

for /f %%G in ('ping localhost -n 100 ^>nul') do (

但您的脚本似乎毫无用处。将 IN() 子句 PING 重定向到 null 意味着没有任何内容可以迭代,因此循环内的代码永远不会触发。即使您删除重定向,它也将非常不准确。

最好在流程开始和结束时获取 %TIME%,然后使用相对简单的解析和数学运算将经过的时间缩短至 1/100 秒。这可以处理长达约 24 小时的时间。

@echo off
setlocal
set "t1=%time%"
rem someCommandThatYouWantToTime
set "t2=%time%"

:: Compute elapsed time as 1/100 seconds
for /f "tokens=1-4 delims=:.," %%a in ("%t1: =0%") do set /a "t1=(((1%%a*60)+1%%b)*60+1%%c)*100+1%%d-36610100"
for /f "tokens=1-4 delims=:.," %%a in ("%t2: =0%") do set /a "t2=(((1%%a*60)+1%%b)*60+1%%c)*100+1%%d-36610100, tDiff=t2-t1"
if %tDiff% lss 0 set /a tDiff+=24*60*60*100

echo Elapsed time = %tDiff% centiseconds

:: Convert centiseconds into hours, minutes, decimal seconds
set /a "f=tDiff%%100, s=(tDiff/100)%%60, m=(tDiff/100/60)%%60, h=tDiff/100/60/60"
if %f% lss 10 set "f=0%f%"
if %s% lss 10 set "s=0%s%"
if %m% lss 10 set "m=0%m%"
if %h% lss 10 set "h=0%h%"

echo Elapsed time = %h%:%m%:%s%.%f%

相关内容