2012-12-05 10 views
10

Es scheint, dass, da ich SET verwenden, um meine Variablen im Batch-Skript zu deklarieren, wenn ich es mehrmals in cmd ausführen, der Variablenwert beibehalten wird, wenn ich sie nicht explizit zurücksetze.Wie löscht man Variablen nach jedem Batch-Script-Lauf?

Muss ich setlocal und endlocal verwenden, um sicherzustellen, dass die Variablen aus einem Lauf nicht auf einen anderen übertragen werden, ohne den CMD herunterzufahren?

Antwort

13

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 
+0

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

Verwandte Themen