4

Я пытаюсь написать командный файл, который занимает время, затраченное командой, и преобразует его в часы, минуты и секунды.

Вот что у меня есть:

@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 и добавить кавычки безрезультатно. Кто-нибудь может помочь?

Кроме того, я где-то читал, что оператор set может не работать в операторе IF - это правда?

1 ответ1

2

Ваша синтаксическая ошибка является результатом вашего неэкранированного перенаправления в предложении FOR IN(). Следующее устранит синтаксическую ошибку:

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

Но ваш сценарий кажется совершенно бесполезным. Перенаправление предложения IN() PING на ноль означает, что итерировать нечего, поэтому код внутри цикла никогда не сработает. Даже если вы удалите перенаправление, оно будет очень неточным.

Лучше получить% 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%

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .