Test Foro de elhacker.net SMF 2.1

Programación => Scripting => Mensaje iniciado por: juntacadaveres en 22 Abril 2019, 18:03 PM

Título: Se puede hacer un IF dentro de un ELSE?? (BATCH)
Publicado por: juntacadaveres en 22 Abril 2019, 18:03 PM
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%"
Título: Re: Se puede hacer un IF dentro de un ELSE?? (BATCH)
Publicado por: juntacadaveres en 22 Abril 2019, 18:57 PM
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
Título: Re: Se puede hacer un IF dentro de un ELSE?? (BATCH)
Publicado por: 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
Título: Re: Se puede hacer un IF dentro de un ELSE?? (BATCH)
Publicado por: juntacadaveres en 22 Abril 2019, 20:39 PM
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.