2012-03-13 12 views
34

Penso di aver riscontrato un errore nello script batch di Windows.Le variabili batch di Windows non verranno impostate

Non riesco a impostare le variabili contenute in un'istruzione estesa se.

Ecco una parte isolata del mio script:

@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. 
) 

Questa è l'uscita da una nuova istanza di cmd:

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

Target: Client 
    dir: 
    zip: 

    test: 42 
    test2: 

Che cosa si dovrebbe notare è che la singola linea di istruzione if imposta correttamente le cose La multilinea se eseguirà tutto ciò che NON è un set. Non penso di aver perso nulla. Inoltre, l'istruzione multiline if sta eseguendo correttamente le linee giuste, poiché le righe else (echo Not successful.) non sono state eseguite.

Perché le righe non sono state eseguite?

+0

wow questa è stata una risposta rapida. Guardandolo ora. – RandomClown

+4

Possibile duplicato di [batch di windows SET in IF non funzionante] (http://stackoverflow.com/questions/9102422/windows-batch-set-inside-if-not-working) – chwarr

+0

Dobbiamo inserire questa domanda nell'intestazione di 'batch-file'. – SteveFest

risposta

65

vi siete persi qualcosa ;-)

cmd espande le variabili quando i comandi sono analizzato, non quando vengono eseguiti. Accade quindi che una dichiarazione if o for con un blocco (...) (o in realtà qualsiasi blocco) blocchi come un singolo comando in quel caso. Quindi, quando imposti le variabili all'interno di un blocco e prova ad usarle nello stesso blocco non ci sono più variabili - sono state sostituite dai valori che le variabili avevano prima del il blocco anche eseguito.

Stick un

setlocal enabledelayedexpansion 

all'inizio del file batch e utilizzare !zip! invece di %zip%. Vedi help set per una discussione dettagliata del problema.

+0

o wow, non lo sapevo mai. Grazie per la conoscenza! – RandomClown

+0

tnaks obrigdo !! – durtto

-1

Solo un promemoria, il comando ms-dos "set" prende ogni stringa dopo il segno di uguale. Quindi, se si scrive

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

L'% a% è in realtà impostato su "foo altro set a = bar", non foo. Quindi uso sempre "()" per il comando set se ci sono più comandi in una riga.

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

il comando "set" non prende sempre ogni stringa dopo il segno di uguale. Esempio: imposta uno = 1 ed echo Hiya. Buon punto a proposito della parentesi, sono davvero super utili. –

Problemi correlati