Windows batch SET all'interno SE non funziona


102

quando eseguo questo script (da un file .bat):

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

Ottengo sempre:

ECHO is on.

Significa che la var2variabile non è stata realmente impostata. Qualcuno può aiutarmi a capire perché?

Risposte:


184

var2 è impostato, ma l'espansione nella riga echo %var2%avviene prima che il blocco venga eseguito.
In questo momento var2è vuoto.

Pertanto esiste la sintassi delayedExpansion, che utilizza al !posto di %e viene valutata in fase di esecuzione, non in fase di analisi.

Si prega di notare che per utilizzare è necessaria la !dichiarazione aggiuntiva setlocal EnableDelayedExpansion.

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

11
Grazie, mi hai appena risparmiato un enorme dolore.
Myna

Stessa regola per &e &&operatori. Questo codice set x=some & set y=%x%thing & echo results %y%restituisce %x%thing.
gwarah

13

Sono un po 'in ritardo alla festa, ma un altro modo per affrontare questa condizione è continuare il processo all'esterno if, in questo modo

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

Oppure / e usa la gotosintassi

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

In questo modo l'espansione avviene "nel tempo" e non serve setlocal EnableDelayedExpansion. In conclusione, se ripensi il design del tuo script puoi farlo in questo modo


Non riesco ad accedere a una variabile che ho creato all'interno di un'istruzione if. Il tuo primo esempio con var2 non funziona.
AntonioCS

@AntonioCS interessante ... questo è lo script esatto che ho appena testato echo off set var1=true if "%var1%"=="true" ( set var2=myvalue ) echo %var2% pause.. e funziona. "se creerai una variabile nel file batch a cui è possibile accedere ovunque nel programma." . aticleworld.com/batch-file-variables-and-scope
TS
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.