Ja, Sie sollten SETLOCAL verwenden. Dadurch werden alle Änderungen lokalisiert, sodass die alte Umgebung wiederhergestellt wird, sobald ENDLOCAL ausgegeben wird.
Wenn die Skriptverarbeitung abgeschlossen ist und Sie zu einem Befehlszeilenkontext zurückkehren, wird für jeden aktiven SETLOCAL ein implizites ENDLOCAL ausgegeben. ENDLOCAL muss nicht explizit ausgegeben werden.
Wenn Ihr Skript (oder Ihre Routine) CALLed ist, dann gibt es bei Abschluss des CALLs ein implizites ENDLOCAL für jedes aktive SETLOCAL, das in der CALLed-Routine ausgegeben wurde. Keine Notwendigkeit ENDLOCAL am Ende einer Routine zu setzen,
Zum Beispiel
@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
Ausgang (obwohl es nicht weh tut):
var=pre-CALL value
var=within CALL value
var=pre-CALL value
ENDLOCAL innerhalb einer aufgerufenen Routine wird nie ein Rollback SETLOCAL, das vor dem CALL ausgegeben wurde. Beispielsweise.
@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
Ergebnis:
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
Ich sehe ... so dass im Grunde jede SET-Operation direkt nach setlocal wird gelöscht, wenn die Ausführung abgeschlossen hat. Ich werde es versuchen. Das schlägt das Löschen der Variablen selbst. – ttback