Arquivo em lote IF Tempo da declaração

4

Estou tentando gravar um arquivo em lote que leva o tempo necessário de um comando e o converte em horas, minutos e segundos.

Veja o que eu tenho:

@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%.

Eu continuo recebendo um ") foi inesperado neste momento." erro. O loop FOR definitivamente funciona e são apenas as instruções IF que são o problema.

Eu tentei usar o operador EQU e adicionar aspas sem sucesso. Alguém poderia ajudar?

Além disso, eu li em algum lugar que o operador set pode não funcionar sob uma instrução IF - isso é verdade?

    
por user3155247 30.04.2014 / 16:51

1 resposta

2

Seu erro de sintaxe é o resultado de seu redirecionamento sem escape dentro da cláusula FOR IN (). A seguir, você eliminará o erro de sintaxe:

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

Mas seu roteiro parece totalmente inútil. Redirecionar a cláusula IN () PING para null significa que não há nada para iterar, portanto, o código dentro do loop nunca será disparado. Mesmo se você remover o redirecionamento, será altamente impreciso.

É melhor obter% TIME% no início e no final do processo e usar análise e matemática relativamente simples para reduzir o tempo decorrido para 1/100 segundos. Isso pode processar tempos até ~ 24 horas.

@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%
    
por 30.04.2014 / 17:18