Tempo di istruzione IF del file batch


4

Sto cercando di scrivere un file batch che richiede il tempo impiegato da un comando e lo converte in ore, minuti e secondi.

Ecco cosa ho:

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

Continuo a ricevere un ") è stato inaspettato in questo momento." errore. Il ciclo FOR funziona sicuramente ed è solo le istruzioni IF che sono il problema.

Ho provato a utilizzare l'operatore EQU e ad aggiungere le virgolette senza alcun risultato. Qualcuno potrebbe aiutare?

Inoltre, ho letto da qualche parte che l'operatore set potrebbe non funzionare con un'istruzione IF - è vero?

Risposte:


2

L'errore di sintassi è il risultato del reindirizzamento senza escape all'interno della clausola FOR IN (). Quanto segue eliminerà l'errore di sintassi:

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

Ma la tua sceneggiatura sembra assolutamente inutile. Reindirizzare la clausola IN () PING su null significa che non c'è nulla da iterare, quindi il codice all'interno del ciclo non verrà mai generato. Anche se rimuovi il reindirizzamento, sarà altamente impreciso.

Meglio ottenere% TIME% all'inizio e alla fine del processo e utilizzare l'analisi e la matematica relativamente semplici per ridurre il tempo trascorso a 1/100 di secondo. Questo può elaborare tempi fino a ~ 24 ore.

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

Se dovessi impostare% TIME% su una variabile, come lo separerei in ore, minuti e secondi?
user3155247

@ user3155247 - vedi risposta aggiornata
dbenham
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.