Sì, è necessario utilizzare SETLOCAL. Ciò localizzerà tutte le modifiche in modo tale che il vecchio ambiente verrà ripristinato una volta emesso ENDLOCAL.
Al termine dell'elaborazione di tutti gli script e in un contesto di riga di comando, viene emesso un ENDLOCAL implicito per ogni SETLOCAL attivo. Non è necessario emettere esplicitamente ENDLOCAL.
Inoltre, se lo script (o la routine) è CALL, al termine della CALL è presente un ENDLOCAL implicito per ogni SETLOCAL attivo emesso all'interno della routine CALL. Non c'è bisogno di mettere ENDLOCAL alla fine di una routine, (anche se non fa male)
Per esempio
@echo off
set var=pre-CALL value
echo var=%var%
call :test
echo var=%var%
exit /b
:test
setlocal
set var=within CALL value
echo var=%var%
exit /b
uscita:
var=pre-CALL value
var=within CALL value
var=pre-CALL value
ENDLOCAL all'interno di una routine chiamata non sarà mai un rollback SETLOCAL che è stato rilasciato prima della CHIAMATA. Per esempio.
@echo off
setlocal
set var=VALUE 1
setlocal
set var=VALUE 2
echo before call: var=%var%
call :test
echo after call: var=%var%
endlocal
echo after endlocal: var=%var%
exit /b
:test
setlocal
set var=VALUE 3
echo within local CALL context: var=%var%
endlocal
echo within CALL after 1st endlocal: var=%var%
endlocal
echo within CALL cannot endlocal to before CALL state: var=%var%
exit /b
Risultato:
before call: var=VALUE 2
within local CALL context: var=VALUE 3
within CALL after 1st endlocal: var=VALUE 2
within CALL cannot endlocal to before CALL state: var=VALUE 2
after call: var=VALUE 2
after endlocal: var=VALUE 1
Capisco ... quindi praticamente ogni operazione SET subito dopo setlocal verranno cancellati quando l'esecuzione viene completata. Lo proverò. Questo batte azzerando le variabili da solo. – ttback