Batch Unable para establecer la variable en el bucle [duplicado]

Tengo el siguiente código:

setlocal enabledelayedexpansion
for /L %%i IN (1,1,5) do (
    set /A is_echoing=0
    if %%i==2 (set /A is_echoing=1)
    if %%i==5 (set /A is_echoing=1)
    if %is_echoing%==1 (
        echo Hello World
    )
)
endlocal

Me está dando un error:

( was unexpected at this time
                    if ==1 (

Parece que la variable is_echoing no está fijada en el bucle. ¿Por qué es este el caso y qué puedo hacer al respecto?

Pregunta hecha hace 3 años, 4 meses, 24 días - Por pixelpioneerc4b5


2 Respuestas:

  • El error que estás experimentando se debe a la forma en que estás intentando acceder a la variable is_echoing dentro del bucle for. En un archivo por lotes de Windows, las variables de entorno dentro de un bloque de comandos en un bucle for deben ser accedidas de una manera especial cuando se está utilizando expansión retardada.

    Para solucionar este problema, necesitas utilizar el operador ! en lugar de % para acceder a is_echoing dentro del bucle. Aquí tienes una versión corregida de tu código:

    batch
    setlocal enabledelayedexpansion
    for /L %%i IN (1,1,5) do (
        set /A is_echoing=0
        if %%i==2 (set /A is_echoing=1)
        if %%i==5 (set /A is_echoing=1)
        if !is_echoing!==1 (
            echo Hello World
        )
    )
    endlocal
    

    Al hacer este cambio, el error que estás experimentando debería desaparecer y el script funcionará correctamente. ¡Espero que esto te haya sido útil! Si tienes alguna otra pregunta o duda, no dudes en decírmelo.

    Respondida el Dec 22, 2020 a las 03:45 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema con el script es que la variable is_echoing se establece dentro del bucle con expansión retrasada habilitada (setlocal enabledelayedexpansion), pero se usa dentro del bucle con expansión normal.

    Para solucionar el problema, se debe utilizar la expansión retrasada dentro de la instrucción if:

    
    if !is_echoing! == 1 (
        echo Hello World
    )
    

    Aquí hay un desglose del código actualizado:

    • setlocal enabledelayedexpansion: Habilita la expansión retrasada de variables dentro del contexto actual.
    • for /L: Crea un bucle que itera desde 1 hasta 5 en incrementos de 1.
    • set /A is_echoing=0: Inicializa la variable is_echoing con el valor 0.
    • if %%i==2: Comprueba si el valor actual de la variable de iteración %%i es igual a 2.
    • set /A is_echoing=1: Si %%i es igual a 2, establece is_echoing en 1.
    • if %%i==5: Comprueba si %%i es igual a 5.
    • set /A is_echoing=1: Si %%i es igual a 5, establece is_echoing en 1.
    • if !is_echoing! == 1 (: Comprueba si el valor de is_echoing expandido retrasadamente es igual a 1.
    • echo Hello World: Si is_echoing es 1, imprime "Hello World".
    10. endlocal: Deshabilita la expansión retrasada de variables fuera del contexto actual.

    Respondida el Dec 22, 2020 a las 03:50 - por Gemini

    Votos positivos: 0 | Votos negativos: 0