Foro de elhacker.net

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
  1. @ECHO OFF
  2. SET NUM1=1
  3. SET NUM2=2
  4. SET OPT=
  5. SET SUM=
  6. IF %NUM1%==%NUM2% (
  7.    ECHO SON IGUALES
  8. ) ELSE (
  9.    ECHO NO SON IGUALES
  10.    ECHO PEQUENIO MENU CON DOS OPCIONES
  11.    ECHO A- SUMAR
  12.    ECHO B- SALIR
  13.    SET /P OPT="SELECCIONA UNA OPCION > "
  14.    IF "%OPT%"=="A" (
  15.        SET /A SUM= %NUM1% + %NUM2%
  16.        ECHO EL RESULTADO DE 1 + 2 ES %SUM%
  17.    )
  18.    IF "%OPT%"=="B" (
  19.        ECHO SALIENDO DEL PROGRAMA && PAUSE>NUL && EXIT
  20.    )
  21. )
  22.  
  23. 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
  1. @ECHO OFF
  2. SET NUM1=1
  3. SET NUM2=2
  4. SET OPT=
  5. SET SUM=
  6. IF %NUM1%==%NUM2% (
  7.    ECHO SON IGUALES
  8. ) ELSE (
  9.    ECHO NO SON IGUALES
  10.    ECHO PEQUENIO MENU CON DOS OPCIONES
  11.    ECHO 1- SUMAR
  12.    ECHO 2- SALIR
  13.    SET /P OPT="SELECCIONA UNA OPCION > "
  14.    IF "%OPT%"=="1" GOTO A
  15.    IF "%OPT%"=="2" GOTO B
  16. )
  17.  
  18. :A
  19. SET /A SUM= %NUM1% + %NUM2%
  20. ECHO EL RESULTADO DE 1 + 2 ES %SUM%
  21. PAUSE>NUL && EXIT
  22.  
  23. :B
  24. ECHO SALIENDO DEL PROGRAMA && PAUSE>NUL && EXIT
  25. 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
  1. @ECHO OFF
  2. SETLOCAL EnableDelayedExpansion
  3. SET NUM1=1
  4. SET NUM2=2
  5. SET OPT=
  6. SET SUM=
  7. IF !NUM1!==!NUM2! (
  8.    ECHO SON IGUALES
  9. ) ELSE (
  10.    ECHO NO SON IGUALES
  11.    ECHO PEQUENIO MENU CON DOS OPCIONES
  12.    ECHO 1- SUMAR
  13.    ECHO 2- SALIR
  14.    SET /P OPT="SELECCIONA UNA OPCION > "
  15.    IF "!OPT!"=="1" GOTO A
  16.    IF "!OPT!"=="2" GOTO B
  17. )
  18.  
  19. :A
  20. SET /A SUM=NUM1 + NUM2
  21. ECHO EL RESULTADO DE 1 + 2 ES !SUM!
  22. PAUSE>NUL && EXIT
  23.  
  24. :B
  25. ECHO SALIENDO DEL PROGRAMA && PAUSE>NUL && EXIT
  26. 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
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
  1. @ECHO OFF
  2. SETLOCAL EnableDelayedExpansion
  3. SET NUM1=1
  4. SET NUM2=2
  5. SET OPT=
  6. SET SUM=
  7. IF !NUM1!==!NUM2! (
  8.    ECHO SON IGUALES
  9. ) ELSE (
  10.    ECHO NO SON IGUALES
  11.    ECHO PEQUENIO MENU CON DOS OPCIONES
  12.    ECHO 1- SUMAR
  13.    ECHO 2- SALIR
  14.    SET /P OPT="SELECCIONA UNA OPCION > "
  15.    IF "!OPT!"=="1" GOTO A
  16.    IF "!OPT!"=="2" GOTO B
  17. )
  18.  
  19. :A
  20. SET /A SUM=NUM1 + NUM2
  21. ECHO EL RESULTADO DE 1 + 2 ES !SUM!
  22. PAUSE>NUL && EXIT
  23.  
  24. :B
  25. ECHO SALIENDO DEL PROGRAMA && PAUSE>NUL && EXIT
  26. 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.