È stato infine aggiunto il supporto per l'espansione ritardata delle variabili di ambiente. Tale supporto è disattivato per ...

È stato infine aggiunto il supporto per l'espansione ritardata delle
variabili di ambiente. Tale supporto è disattivato per impostazione
predefinita, ma può essere attivato e disattivato utilizzando l'opzione
/V del comando CMD.EXE. Digitare CMD /? per ulteriori informazioni.

L'espansione ritardata delle variabili di ambiente consente di ovviare
alle limitazioni dell'espansione immediata, che viene effettuata alla
lettura di una riga di testo, ma non quando quest'ultima viene eseguita.
Il problema dell'espansione immediata è illustrato dall'esempio seguente:

    set VAR=prima
    if "%%VAR%%" == "prima" (
        set VAR=dopo
        if "%%VAR%%" == "dopo" @echo Se questo messaggio viene visualizzato,
                                     il codice funziona
    )

Questa istruzione non visualizza il messaggio perché, in ENTRAMBE le
istruzioni IF, la variabile %%VAR%% viene sostituita alla lettura della
prima istruzione IF, poiché include logicamente il corpo di IF, che è
un'istruzione composta. L'istruzione IF all'interno dell'istruzione
composta confronta pertanto i valori "prima" e "dopo", che non sono mai
uguali. Anche l'esempio seguente non funziona come previsto:

    set LIST=
    for %%i in (*) do set LIST=%%LIST%% %%i
    echo %%LIST%%

perché NON crea l'elenco dei file della directory corrente, ma imposta
semplicemente la variabile LIST sull'ultimo file trovato. Come in precedenza,
questo accade perché la variabile %%LIST%% viene espansa solo una volta alla
lettura dell'istruzione FOR e, in quel momento, la variabile LIST è vuota.
Di fatto viene pertanto eseguito il ciclo FOR seguente:

    for %%i in (*) do set LIST= %%i

che continua a impostare LIST sull'ultimo file trovato.

L'espansione ritardata delle variabili di ambiente consente di espandere
le variabili di ambiente al momento dell'esecuzione, semplicemente utilizzando
un carattere diverso (il punto esclamativo). Se l'espansione ritardata delle
variabili di ambiente è attivata, gli esempi precedenti possono essere
riscritti come segue, e funzioneranno correttamente:

    set VAR=prima
    if "%%VAR%%" == "prima" (
        set VAR=dopo
        if "!VAR!" == "dopo" @echo Se questo messaggio viene visualizzato, il
                                   codice funziona
    )

    set LIST=
    for %%i in (*) do set LIST=!LIST! %%i
    echo %%LIST%%