Se puede hacer un IF dentro de un ELSE?? (BATCH)

Iniciado por juntacadaveres, 22 Abril 2019, 18:03 PM

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

juntacadaveres

He estado haciendo un script para creación de usuarios desde el contenido de un archivo de texto plano y estoy sospechando de que no me sale por poner un IF después de un ELSE. Así que hice un script más simple aparte para comprobar si esto era cierto
aquí el script:

Código (dos) [Seleccionar]
@ECHO OFF
SET NUM1=1
SET NUM2=2
SET OPT=
SET SUM=
IF %NUM1%==%NUM2% (
   ECHO SON IGUALES
) ELSE (
   ECHO NO SON IGUALES
   ECHO PEQUENIO MENU CON DOS OPCIONES
   ECHO A- SUMAR
   ECHO B- SALIR
   SET /P OPT="SELECCIONA UNA OPCION > "
   IF "%OPT%"=="A" (
       SET /A SUM= %NUM1% + %NUM2%
       ECHO EL RESULTADO DE 1 + 2 ES %SUM%
   )
   IF "%OPT%"=="B" (
       ECHO SALIENDO DEL PROGRAMA && PAUSE>NUL && EXIT
   )
)

PAUSE>NUL

El script funciona correctamente hasta llegar al apartado del IF "%opt%"

juntacadaveres

Mejoré el script

Código (dos) [Seleccionar]
@ECHO OFF
SET NUM1=1
SET NUM2=2
SET OPT=
SET SUM=
IF %NUM1%==%NUM2% (
    ECHO SON IGUALES
) ELSE (
    ECHO NO SON IGUALES
    ECHO PEQUENIO MENU CON DOS OPCIONES
    ECHO 1- SUMAR
    ECHO 2- SALIR
    SET /P OPT="SELECCIONA UNA OPCION > "
    IF "%OPT%"=="1" GOTO A
    IF "%OPT%"=="2" GOTO B
)

:A
SET /A SUM= %NUM1% + %NUM2%
ECHO EL RESULTADO DE 1 + 2 ES %SUM%
PAUSE>NUL && EXIT

:B
ECHO SALIENDO DEL PROGRAMA && PAUSE>NUL && EXIT
PAUSE>NUL


Y no me funciona
en ambos casos me manda hacia A
aunque ponga B

EdePC

#2
Saludos,

- Las variables en Bacth tienen un comportamiento inusual cuando se ejecutan en sentencias de una sola línea como sentencia & sentencia, o sentencia | sentencia, etc, las sentencias que van entre paréntesis se consideran que van en línea.

- Ese comportamiento inusual hace que las variables  no actualicen sus valores, se le asigna un valor la primera vez y luego no se notarán siguientes cambios hasta que termine la sentencia en línea.

- Para solucionar esto se utiliza SETLOCAL EnableDelayedExpansion, esto hace que las variables si se actualicen tal como se espera, pero las variables deben cambiar su notación %variable% por !variable!.

- Recuerda que para SET /A no es necesario utilizar %variable% o !variable!, esto se sobreentiende.

Código (dos) [Seleccionar]
@ECHO OFF
SETLOCAL EnableDelayedExpansion
SET NUM1=1
SET NUM2=2
SET OPT=
SET SUM=
IF !NUM1!==!NUM2! (
   ECHO SON IGUALES
) ELSE (
   ECHO NO SON IGUALES
   ECHO PEQUENIO MENU CON DOS OPCIONES
   ECHO 1- SUMAR
   ECHO 2- SALIR
   SET /P OPT="SELECCIONA UNA OPCION > "
   IF "!OPT!"=="1" GOTO A
   IF "!OPT!"=="2" GOTO B
)

:A
SET /A SUM=NUM1 + NUM2
ECHO EL RESULTADO DE 1 + 2 ES !SUM!
PAUSE>NUL && EXIT

:B
ECHO SALIENDO DEL PROGRAMA && PAUSE>NUL && EXIT
PAUSE>NUL


- Otra forma es usando CALL. Ver el comportamiento de todo esto en:
https://ss64.com/nt/delayedexpansion.html

juntacadaveres

Cita de: EdePC en 22 Abril 2019, 19:30 PM
Saludos,

- Las variables en Bacth tienen un comportamiento inusual cuando se ejecutan en sentencias de una sola línea como sentencia & sentencia, o sentencia | sentencia, etc, las sentencias que van entre paréntesis se consideran que van en línea.

- Ese comportamiento inusual hace que las variables  no actualicen sus valores, se le asigna un valor la primera vez y luego no se notarán siguientes cambios hasta que termine la sentencia en línea.

- Para solucionar esto se utiliza SETLOCAL EnableDelayedExpansion, esto hace que las variables si se actualicen tal como se espera, pero las variables deben cambiar su notación %variable% por !variable!.

- Recuerda que para SET /A no es necesario utilizar %variable% o !variable!, esto se sobreentiende.

Código (dos) [Seleccionar]
@ECHO OFF
SETLOCAL EnableDelayedExpansion
SET NUM1=1
SET NUM2=2
SET OPT=
SET SUM=
IF !NUM1!==!NUM2! (
   ECHO SON IGUALES
) ELSE (
   ECHO NO SON IGUALES
   ECHO PEQUENIO MENU CON DOS OPCIONES
   ECHO 1- SUMAR
   ECHO 2- SALIR
   SET /P OPT="SELECCIONA UNA OPCION > "
   IF "!OPT!"=="1" GOTO A
   IF "!OPT!"=="2" GOTO B
)

:A
SET /A SUM=NUM1 + NUM2
ECHO EL RESULTADO DE 1 + 2 ES !SUM!
PAUSE>NUL && EXIT

:B
ECHO SALIENDO DEL PROGRAMA && PAUSE>NUL && EXIT
PAUSE>NUL


- Otra forma es usando CALL. Ver el comportamiento de todo esto en:
https://ss64.com/nt/delayedexpansion.html

Muchas gracias por tu ayuda.