Test Foro de elhacker.net SMF 2.1

Programación => Scripting => Mensaje iniciado por: BatchianoISpyxolo en 7 Abril 2012, 09:40 AM

Título: Contador (cuenta atrás)
Publicado por: BatchianoISpyxolo en 7 Abril 2012, 09:40 AM
Pues he implementado una cuenta atrás en Batch... segurísimamente ya esté hecho... pero me apetecía pensar como hacerlo... opiniones... mejoras... aplicaciones para la cuenta atrás... ideas... críticas constructivas... todo bienvenido :P

Operadores lógicos...

Código (dos) [Seleccionar]

::Cuenta atrás
::Batchiano
@echo off
setlocal enabledelayedexpansion
:menu
set /p h="Horas: "
set /p m="Minutos: "
set /p s="Segundos: "
for %%z in (h,m,s) do if not defined %%z (
call :formato
)
if %h% GEQ 0 (
if %m% GEQ 0 (
if %m% LEQ 59 (
if %s% GEQ 0 (
if %s% LEQ 59 (
call :contador
) else (
call :formato
)
) else (
call :fomato
)
) else (
call :formato
)
) else (
call :formato
)
) else (
call :formato
)
goto :eof

:contador
cls
if %h% GEQ 0 (
if %m% GEQ 0 (
if %s% GEQ 0 (
for /l %%a in (!h!,-1,0) do (
for /l %%b in (!m!,-1,0) do (
for /l %%c in (!s!,-1,0) do (
echo Contador: %%a:%%b:%%c
ping localhost -n 2 > nul
cls
)
set s=59
)
set m=59
)
)
)
)
goto :eof

:formato
echo Formato incorrecto. Vuelva a intentarlo
pause>nul & cls & call :menu
Título: Re: Contador (cuenta atrás)
Publicado por: Eleкtro en 7 Abril 2012, 13:07 PM
Cita de: Batchiano en  7 Abril 2012, 09:40 AM
críticas constructivas...
mejoras...

Si quieres mejorar el code puedes hacer de el una función (Además de simplificarlo). Aqui tienes un ejemplo:

Código (dos) [Seleccionar]

:: Contador.bat
:: By Elektro H@cker
:: Visita Foro.ElHacker.Net

@Echo OFF
Setlocal EnableDelayedexpansion

:Menu
IF "%~1" EQU "" (
Set /P "H=Horas: " && Set /P "M=Minutos: " && Set /P "S=Segundos: "
Echo !H!!M!!S! | Findstr /I "[A-Z]" >NUL
       IF !Errorlevel! EQU 0 (Goto :ERROR)
) Else (
For /F "Tokens=1-3 delims=:" %%a in ('Echo %~1') Do (Set /A H=%%a, M=%%b, S=%%c) || (Goto :ERROR)
)

:TimeLoop
Cls
For /F %%? in ('Echo %h%:%m%:%s%') Do (
IF !H! LSS 0 (Goto :End)
IF !S! EQU 0 (Set /A S=60, M-=1)
IF !M! LSS 0 (Set /A H-=1, M=59, S=60)
Set /A S-=1
Echo Contador: %h%:%m%:%s%
Ping -n 2 Localhost 1>Nul
Goto :TimeLoop
)

:Error
Echo: Formato incorrecto. Vuelva a intentarlo...
Exit /B 1

:End
Echo Fin de la cuenta atras.
Exit /B 0


CitarModo de empleo:

Contador.bat [Horas]:[Minutos]:[Segundos]
  • Ejemplo: Contador 1:0:59
Salu2.
Título: Re: Contador (cuenta atrás)
Publicado por: ELVJop en 7 Abril 2012, 21:23 PM
para sacarle el máximo rendimiento al code lo dejaría así:


@Echo OFF
Setlocal EnableDelayedexpansion

:Menu
IF "%~1" EQU "" (
Set /P H=Horas:
Echo !H! | Findstr /I "[A-Z]" >NUL
IF !Errorlevel! EQU 0 (Goto :ERROR)
Set /P M=Minutos:
Echo !M! | Findstr /I "[A-Z]" >NUL
IF !Errorlevel! EQU 0 (Goto :ERROR)
Set /P S=Segundos:
) Else (
For /F "Tokens=1-3 delims=:" %%a in ('Echo %~1') Do (Set /A H=%%a, M=%%b, S=%%c) || (Goto :ERROR)
)

:TimeLoop
Cls
For /F %%? in ('Echo %h%:%m%:%s%') Do (
IF !H! LSS 0 (Goto :End)
IF !S! EQU 0 (Set /A S=60, M-=1)
IF !M! LSS 0 (Set /A H-=1, M=59, S=60)
Set /A S-=1
Echo Contador: %h%:%m%:%s%
Ping -n 2 Localhost 1>Nul
Goto :TimeLoop
)

:End
Echo Fin de la cuenta atras.
echo.
echo Desea volver a iniciar el contador?
echo.
echo Teclee el numero correspondiente y pulse Enter
echo.
echo 1. Si
echo 2. No
set /P pregunta=
if %pregunta%==1 goto :menu2
if %pregunta%==2 goto :salir
IF !Errorlevel! EQU 1 (Goto :ERROR2)

:Error
Echo: Incorrecto vuelva a probar...
goto :error2

:Error2
cls
echo Desea volver a iniciar el contador?
echo.
echo Teclee el numero correspondiente y pulse Enter
echo.
echo 1. Si
echo 2. No
set /P pregunta=
if %pregunta%==1 goto :menu2
if %pregunta%==2 goto :salir
IF !Errorlevel! EQU 1 (Goto :ERROR2)

:salir
exit


PD: Electro hacker no revisaste tu propio code no dega leer lo echo del error y del end
Título: Re: Contador (cuenta atrás)
Publicado por: Eleкtro en 8 Abril 2012, 18:51 PM
No hombre, Si que lo revisé, Se cierra porque lo abres manualmente el Bat. Está pensado para llamar al Bat desde otro Bat o usandolo como expliqué.
Fijate en los códigos de salida del exit.



Esta parte de tu code se puede simplificar un poco más:
Código (DOS) [Seleccionar]

:End
Echo Fin de la cuenta atras.
echo.
echo Desea volver a iniciar el contador?
echo.
echo Teclee el numero correspondiente y pulse Enter
echo.
echo 1. Si
echo 2. No
set /P pregunta=
if %pregunta%==1 goto :menu2
if %pregunta%==2 goto :salir
IF !Errorlevel! EQU 1 (Goto :ERROR2)

:Error2
cls
echo Desea volver a iniciar el contador?
echo.
echo Teclee el numero correspondiente y pulse Enter
echo.
echo 1. Si
echo 2. No
set /P pregunta=
if %pregunta%==1 goto :menu2
if %pregunta%==2 goto :salir
IF !Errorlevel! EQU 1 (Goto :ERROR2)



Código (dos) [Seleccionar]

Choice /M "Desea volver a iniciar el contador?"
If %errorlevel% EQU 1 (goto :menu2) ELSE (goto :salir)


Salu2!