Fichier de traitement par lot IF

4

J'essaie d'écrire un fichier de commandes qui prend le temps d'une commande et le convertit en heures, minutes et secondes.

Voici ce que j'ai

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

Je continue à recevoir un ") était inattendu à cette époque." Erreur. La boucle FOR fonctionne définitivement et ce sont juste les instructions IF qui posent problème.

J'ai essayé d'utiliser l'opérateur EQU et d'ajouter des guillemets en vain. Quelqu'un pourrait-il aider?

De plus, j'ai lu quelque part que l'opérateur de l'ensemble peut ne pas fonctionner avec une instruction IF - est-ce vrai?

utilisateur3155247
la source

Réponses:

2

Votre erreur de syntaxe est le résultat de votre redirection sans échappement dans la clause FOR IN (). Les éléments suivants élimineront l'erreur de syntaxe:

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

Mais votre script semble totalement inutile. La redirection de la clause PING de la clause IN () vers null signifie qu'il n'y a rien à itérer, le code dans la boucle ne sera donc jamais déclenché. Même si vous supprimez la redirection, celle-ci sera extrêmement imprécise.

Il est préférable d’obtenir le% TIME% au début et à la fin du processus et d’utiliser une analyse et des calculs relativement simples pour réduire le temps écoulé à 1/100 seconde. Cela peut traiter des temps allant jusqu'à ~ 24 heures.

@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%
Dbenham
la source
Si je devais définir% TIME sur une variable, comment puis-je le séparer en heures, minutes et secondes?
user3155247
@ user3155247 - voir réponse mise à jour
dbenham le