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, si traduce in:
FOO: 1
Press any key to continue . . .
Tuttavia, se inserisco le stesse due linee all'interno di un blocco SE NON DEFINITO:
@echo off
IF NOT DEFINED BAR (
set FOO=1
echo FOO: %FOO%
)
pause
echo on
Ciò si traduce inaspettatamente in:
FOO:
Press any key to continue . . .
Questo non dovrebbe avere nulla a che fare con l'IF, chiaramente il blocco è in esecuzione. Se definisco BAR sopra l'if, viene visualizzato solo il testo del comando PAUSE, come previsto.
Cosa dà?
Domanda di follow-up: esiste un modo per abilitare l'espansione ritardata senza setlocal?
Se dovessi chiamare questo semplice esempio di file batch da 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 mostra:
FOO: 1
FOO:
Press any key to continue . . .
In questo caso, sembra che devo abilitare l'espansione ritardata nel CALLER, che potrebbe essere una seccatura.
!
, usa^^^!
(scappa due volte). Altrimenti la funzione "espansione ritardata" la consumerà.