我正在尝试编写一个批处理文件,将命令所用的时间转换为小时、分钟和秒。
以下是我得到的信息:
@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%