Intentaré ir haciendo pequeños programas bat, explicando el código empleado para que cualquiera lo entienda.

domingo, 6 de julio de 2008

TEMPORIZANDO O RETARDANDO PROGRAMAS

Ya sabemos todos que cuando usamos el comando pause nuestro programa se detiene a la espera de que pulsemos una tecla y asi continuara de nuevo.
Pero a veces nos interesa que el programa haga una pequeña parada controlada sin necesidad de tener que volver a pulsar una tecla. Esto se puede lograr de dos formas:

Mediante el uso de ping y haciendo un bucle temporal.


USO DE PING

Sabemos que el comando ping se retarda 3 segundos cada vez que lo ejecutamos en un programa. Por tanto con la siguiente formula sabremos el numero de pings que debemos hacer para retardar un determinado numero de segundos.
3 segundos = 1 ping
1 segundo = 1 ping /3 ------------ ping -n 2
60 segundos = 60 pings /3 = 20 pings

Podemos ver en la siguiente plantilla 3 tipos de retardo:
ping -n 2 localhost > nul ---------- retarda 1 segundo
ping localhost > nul --------------- retarda 3 segundos
for /L %%letra (0,1,60) do (ping -n 2 localhost > nul) ------------ retarda 1 minuto
for /L %%letra (0,1,20) do (ping localhost > nul) ------------tambien retarda 1 minuto

Como se puede ver se ha utilizado el bucle for para evitar repetir el ping 60 veces.
Redireccionamos > nul para que no se vea la salida asi el retardo es mas limpio.

En el siguiente programa se ve claramente:

@echo off
echo ESTA ES LA PRIMERA FRASE
for /L %%a in (1,1,10) do (ping -n 2 localhost > nul&&echo %%a)
echo DESPUES DE 10 SEGUNDOS SALE ESTA FRASE
for /L %%a in (11,1,20) do (ping -n 2 localhost > nul&&echo %%a)
echo DESPUES DE 20 SEGUNDOS SALE ESTA FRASE
pause
exit


USO DE BUCLES DE TIEMPO

Anteriormente ya vimos la utilizacion del bucle for en conjuncion con ping para hacer un bucle de tiempo. Pero si no utilizamos ping tambien se puede hacer un bucle de tiempo simplemente el numero final que sea elevado.

La sintaxis seria:
FOR /L %%letra IN (0,1,numero_elevado) DO (echo %%letra > nul)

Dependiendo del numero_elevado que pongamos tardara mas o menos.

Por ejemplo:

@echo off
echo PRIMERA FRASE
for /l %%a in (0,1,70000) do (echo %%a > nul)
echo SEGUNDA FRASE: 70000 tarda 10 segundos aproximadamente
pause
exit

Tambien podriamos obtener el mismo resultado con el bucle de tipo :etiqueta.
Sin embargo el numero que se repite debe ser menor ya que es mas lento este bucle al realizar las operaciones.

@echo off
echo PRIMERA FRASE
:inicio
set /a num=num+1
if %num%==10000 goto salir
goto inicio
:salir
echo SEGUNDA FRASE: 10000 tarda 10 segundos aproximadamente
pause

Todo es cuestion de elegir la formula que mejor se adapte a nuestro programa. Sin embargo yo aconsejo mejor temporizar con el ping cuando se trata de precision en cuanto a la espera.




***

No hay comentarios: