Lote de Windows SET dentro de SI no funciona


102

cuando estoy ejecutando este script (desde un archivo .bat):

set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo %var2%
)

Siempre consigo:

ECHO is on.

Lo que significa que la var2variable no se estableció realmente. ¿Alguien puede ayudarme a entender por qué?

Respuestas:


184

var2 está establecido, pero la expansión en la línea echo %var2%ocurre antes de que se ejecute el bloque.
En este momento var2está vacío.

Por lo tanto, existe la sintaxis delayedExpansion, se usa en !lugar de %y se evalúa en el tiempo de ejecución, no en el tiempo de análisis.

Tenga en cuenta que para usar !, setlocal EnableDelayedExpansionse necesita la declaración adicional .

setlocal EnableDelayedExpansion
set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo !var2!
)

11
Gracias, me ahorraste un gran dolor.
Myna

Misma regla para &y &&operadores. Este código set x=some & set y=%x%thing & echo results %y%genera %x%thing.
gwarah

13

Llego un poco tarde a la fiesta, pero otra forma de lidiar con esta condición es continuar el proceso afuera if, así

set var1=true
if "%var1%"=="true" (
    set var2=myvalue
)
echo %var2%

O / y usa la gotosintaxis

set var1=true
if "%var1%"=="true" (
    set var2=myvalue
    goto line10
) else (
    goto line20
)
. . . . .
:line10
echo %var2%
. . . . . 
:line20

De esta manera, la expansión se produce "en el tiempo" y no es necesario setlocal EnableDelayedExpansion. En pocas palabras, si reconsideras el diseño de tu guión, puedes hacerlo así.


No puedo acceder a una variable que creé dentro de una declaración if. Su primer ejemplo con var2 no funciona.
AntonioCS

@AntonioCS interesante ... este es el script exacto que acabo de probar echo off set var1=true if "%var1%"=="true" ( set var2=myvalue ) echo %var2% pause... y está funcionando. "si va a crear una variable en el archivo por lotes a la que se pueda acceder desde cualquier parte del programa". . aticleworld.com/batch-file-variables-and-scope
TS
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.