2012-03-13 18 views
34

Creo que me encontré con un error en el script por lotes de Windows.Las variables del lote de Windows no se configurarán

No puedo establecer las variables que están en una instrucción if expandida.

Aquí es una parte aislada de mi guión:

@echo off 

set success=1 
set Version=12345 
set Target=Client 
set Type=456 
set dir= 
set zip= 

if "%Version%"=="" set success=0 
if "%Type%"=="" set success=0 

if 1==1 set test=42 

if %success%==1 (
    set test2=57005 
    if "%Target%"=="Client" (
     set dir=ModName v%Version% 
     set zip=ModName v%Version% %Type%.zip 
     echo Version: %Version% 
     echo Type: %Type% 
     echo. 
     echo Target: %Target% 
     echo  dir: %dir% 
     echo  zip: %zip% 
     echo. 
     echo test: %test% 
     echo test2: %test2% 
    ) 
) else (
    echo Not successful. 
) 

Ésta es la salida de una nueva instancia de cmd:

C:\Users\RandomClown\Desktop>test.bat 
Version: 12345 
    Type: 456 

Target: Client 
    dir: 
    zip: 

    test: 42 
    test2: 

Lo que se debe notar es que la línea única sentencia if correctamente establece cosas. La multilínea si realizará cualquier cosa que NO sea un conjunto. No creo que me haya perdido nada. Además, la sentencia if multilínea está ejecutando correctamente las líneas correctas, ya que las líneas else (echo Not successful.) no se ejecutaron.

¿Por qué las líneas no se ejecutaron?

+0

wow que fue una respuesta rápida. Mirándolo ahora. – RandomClown

+4

Posible duplicado de [lote de Windows SET dentro de SI no funciona] (http://stackoverflow.com/questions/9102422/windows-batch-set-inside-if-not-working) – chwarr

+0

Tenemos que poner esta pregunta en el encabezado de 'batch-file'. – SteveFest

Respuesta

65

se ha perdido algo ;-)

cmd expande las variables cuando los comandos son analizados sintácticamente , no cuando se ejecutan. Sucede que una instrucción if o for con un bloque (...) (o en realidad cualquier bloque) funciona como un único comando en ese caso. Entonces cuando configura variables dentro de un bloque y intente usarlas en el mismo bloque ya no hay variables - fueron reemplazadas por los valores que las variables tenían antes de el bloque incluso ejecutado.

palillo de un

setlocal enabledelayedexpansion 

al comienzo de su archivo por lotes y utilizar !zip! en lugar de %zip%. Ver help set para una discusión detallada del problema.

+0

o wow, nunca lo sabía. Gracias por el conocimiento! – RandomClown

+0

tnaks obrigdo !! – durtto

-1

Solo un recordatorio, el comando ms-dos "set" toma cada cadena después del signo igual. Así que si usted escribe

if "x"=="x" set a=foo else set a=bar 
echo %a% // output : foo else set a=bar 

El% a% es en realidad establece en "foo otra cosa = estableció un bar", no foo. Así que siempre uso "()" para establecer el comando si hay múltiples comandos en una línea.

if "%1"=="" (set a=20) else (set a=%1)  
+1

el comando "establecer" no siempre toma cada cadena después del signo igual. Ejemplo: establecer uno = 1 y eco Hiya. Buen punto sobre el paréntesis, sin embargo, son muy útiles. –

Cuestiones relacionadas