Le variabili nel file batch non vengono impostate quando sono dentro IF?
Ho due esempi di file batch molto semplici:
Assegnare un valore a una variabile:
@echo off
set FOO=1
echo FOO: %FOO%
pause
echo on
Che, come previsto, risulta in:
FOO: 1
Press any key to continue . . .
Tuttavia, se metto le stesse due righe all'interno di un blocco IF NOT DEFINED:
@echo off
IF NOT DEFINED BAR (
set FOO=1
echo FOO: %FOO%
)
pause
echo on
Questo inaspettatamente risulta in:
FOO:
Press any key to continue . . .
Questo non dovrebbe avere niente a che fare con l'IF, chiaramente il blocco viene eseguito. Se definisco BAR sopra l'if, viene visualizzato solo il testo del comando PAUSE, come previsto.
Cosa succede?
Domanda successiva: C'è un modo per abilitare l'espansione ritardata senza setlocal?
Se dovessi chiamare questo semplice file batch di esempio da dentro un altro, l'esempio imposta FOO, ma solo LOCALMENTE.
Per esempio:
testcaller.bat
@call test.bat
@echo FOO: %FOO%
@pause
test.bat
@setlocal EnableDelayedExpansion
@IF NOT DEFINED BAR (
@set FOO=1
@echo FOO: !FOO!
)
Questo visualizza:
FOO: 1
FOO:
Press any key to continue . . .
In questo caso, sembra che io debba abilitare l'espansione ritardata nel CALLER, che potrebbe essere una seccatura.