[BATCH] Problemas con else if

Iniciado por ovichan, 13 Julio 2012, 19:35 PM

0 Miembros y 1 Visitante están viendo este tema.

ovichan

Buenas, se que en este lenguaje no existe la particula propiamente dicha, ELSE IF sino que hay que hacer otra cosa. He estado mirando por la web y la solucion seria anidar los condicionales pero desgraciadamente no me sale  :-(

Os dejo el código, y marco de negro la zona conflictiva. A ver en que me estoy equivocando.

Código (dos) [Seleccionar]
@echo off
color 0A
title Apagado condicional

:inicio
echo ¨Qu, quieres hacer?
echo.
echo 1. Apagar en un tiempo espec¡fico
echo 2. Apagar
echo 3. Reiniciar
echo 4. Cerrar sesion
echo 5. Hibernar
echo 6. Cancelar
echo.
echo 7. Quitar
echo.

set /p eleccion="Elija una opci¢n: "
if %eleccion%==1 goto apagado
if %eleccion%==2 shutdown -s -f
if %eleccion%==3 shutdown -r -f
if %eleccion%==4 shutdown -l -f
if %eleccion%==5 shutdown -h -f
if %eleccion%==6 goto cancelar
if %eleccion%==7 exit
echo Elecci¢n inv lida: %eleccion%
echo.
pause
cls
goto inicio

:apagado
cls
set /p min="Minutos antes de apagar: "
set /a sec=60*%min%
shutdown -s -f -t %sec%
cls

:: Opcion con extractor de caracteres
rem set h=%time:~0,2%
rem set m=%time:~3,2%
rem set s=%time:~6,2%
rem set ms=%time:~9,2%

:: Opcion con bucle

for /F "tokens=1,2,3,4 delims=:," %%H in ("%time%") do set "h=%%H" & set "m=%%I" & set "s=%%J" & set "ms=%%K"

:: Suma de los minutos insertados a la hora actual, para ser mostrada en la interfaz
set /a m=%m%+%min%

:: Reajustar horas y minutos
if %m% GEQ 60 set /a h=%h%+(%m%/60) && set /a m=(%m%)%%60
if %h% GEQ 24 set /a h=(%h%)%%24


Esta es la parte que no funciona:
Código (dos) [Seleccionar]
:: Mensaje de salida, en formatos diferentes

IF %h% LSS 10 (IF %m% LSS 10 ("echo El apagado se iniciar  a las 0%h%:0%m%:%s%,%ms%.")

) ELSE (

IF %h% GEQ 10 (IF %m% LSS 10 ("echo El apagado se iniciar  a las %h%:0%m%:%s%,%ms%."))

) ELSE (

IF %h% LSS 10 (IF %m% GEQ 10 ("echo El apagado se iniciar  a las 0%h%:%m%:%s%,%ms%."))

) ELSE (

echo "El apagado se iniciar  a las %h%:%m%:%s%,%ms%."

)
)
)

echo.
goto inicio

:cancelar
cls
shutdown -a
pause
cls
goto inicio




Saludos y gracias de antemano.

Binary_Death

#1
Un else-if tipo C, en batch sería:



If condicion1 (accion) else (
                  if condicion2 (accion) else (
                                     if condicion3 (accion)
                                     ...
                                     ) else (
                                     acciondefault



Cerrando todos los bloques pertinentes.

ovichan

#2
Ok, entonces creo que el fallo lo tengo en ciertos parentesis

Código (dos) [Seleccionar]
IF %h% LSS 10 (IF %m% LSS 10 ("echo El apagado se iniciar  a las 0%h%:0%m%:%s%,%ms%.")

) ELSE (

IF %h% GEQ 10 (IF %m% LSS 10 ("echo El apagado se iniciar  a las %h%:0%m%:%s%,%ms%."))

) ELSE (

IF %h% LSS 10 (IF %m% GEQ 10 ("echo El apagado se iniciar  a las 0%h%:%m%:%s%,%ms%."))

) ELSE (

echo "El apagado se iniciar  a las %h%:%m%:%s%,%ms%."

)
)
)


Los he quitado y al menos el script ya no se cierra pero me indica: El nombre de archivo, el nombre de directorio o la sintaxis de la etiqueta del volumen no son correctos.

Y otra duda, no se puede usar como en C los operadores logicos &&?? Para algo como:

If condicion1 && condicion2 (accion) else (acciondefault)

EDITO: Ahora no me muestra ni el mensaje arrgggggg >:D

EDITO2: He detectado que el error esta marcado en esta linea: IF %h% LSS 10 (IF %m% GEQ 10 ("echo El apagado se iniciar  a las 0%h%:%m%:%s%,%ms%.")

Pero no se pq

Binary_Death

¿Por qué le has puesto comillas a los echo?

Prueba en la cmd:


"echo Hola Mundo"


Dará error.

Respecto a los operadores lógicos, no, no se pueden usar como en C (lástima, sería útil a veces).
Estos operadores sirven para trabajar con los errorlevel de los comandos.


comando1 && comando2


Ejecuta comando2 sólo si el errorlevel devuelto por comando1 es 0.


comando1 || comando2


Ejecuta comando 2 sólo si el errorlevel devuelto por comando1 no es 0.

Pero no se pueden usar en los condicionales.

Saludos  :P

ovichan

#4
Los he borrado pero sigue sin funcionarme la linea. Sin embargo, he dado con la solucion aunque no es de mi agrado pues queria haberlo hecho con condicionales anidados.

Solucion:
Código (dos) [Seleccionar]

:: Mensaje de salida, en formatos diferentes

IF %h% LSS 10 (IF %m% LSS 10 (echo El apagado se iniciar  a las 0%h%:0%m%:%s%,%ms%. && echo. && goto inicio))
IF %h% GEQ 10 (IF %m% LSS 10 (echo El apagado se iniciar  a las %h%:0%m%:%s%,%ms%.  && echo. && goto inicio))
IF %h% LSS 10 (IF %m% GEQ 10 (echo El apagado se iniciar  a las 0%h%:%m%:%s%,%ms%.  && echo. && goto inicio))

echo El apagado se iniciar  a las %h%:%m%:%s%,%ms%.

echo.
goto inicio


Esta claro que el problema provenia de cuando el programa interpreta las condiciones, al estar anidados ni si quiera valora la tercera condicion saliendo de los condicionales anidados.

Vamos que cuando exponia el caso de que la hora es menor de 10 y los minutos mayor de 10, como interpreta las condiciones anteriores y las valora, se rompia el proceso cuando pasaba por GEQ 10, al no cumplirse se rompia y no saltaba al siguiente ELSE.

Eso creo que es lo que pasaba. Saludos




Moderador: ¿Porque sigues usando en las respuestas el botón "citar" para insertar código?  :-/

Eleкtro

#5
ovichan, La estás liando pero mucho, Si quisieras crear una cuenta atrás, aún aceptaria el método que estás intentando con condicionales, Pero tú propósito es mostrar el comando del "echo" con la hora, una única vez, Por lo tanto, Lo más coherente además de sencillo y eficaz, Es manipular el string para añadirle el "0"...
Código (dos) [Seleccionar]

IF "%H%" LSS "10" (Set "H=0%H%")
IF "%M%" LSS "10" (Set "M=0%M%")
REM IF "%S%" LSS "10" (Set "S=0%S%")

Echo: El apagado se iniciara a las %h%:%m%:%s%,%ms%. | MORE
Goto :Inicio


Saludos.


EDITO: Quizás esto es un poco OFFTOPIC, Pero por si llegases a plantearte hacer una cuenta regresiva con el tiempo de apagado, Te dejo esta info que te puede ayudar:

http://foro.elhacker.net/scripting/batch_problema_script_cuenta_regresiva-t363802.0.html;msg1755901#msg1755901
+ http://foro.elhacker.net/empty-t358542.0.html








ovichan

#6
Cierto cierto es mas sencillo, pero cuesta acomodarse a este lenguaje y sus limitaciones y demás; muxas veces dudo si se pueden hacer ciertas cosas o no. Gracias por el off, le echare un ojo. Saludos cracks

EDITO: Tu forma me iba bien pero en horas de madrugada se seguia comiendo el cero incluso dandole el formato, y se debe a las comillas. Siendo lo correcto para mi caso:

Código (dos) [Seleccionar]
IF %H% LSS 10 (Set H=0%H%)
IF %M% LSS 10 (Set M=0%M%)


Echo El apagado se iniciara a las %h%:%m%:%s%,%ms%.
Goto :Inicio


Para los segundo no hace falta, win los incluye automaticamente O_o