2012-12-05 28 views
10

Sembra che poiché utilizzo SET per dichiarare le mie variabili nello script batch, se lo eseguo più volte in cmd, il valore della variabile verrà mantenuto a meno che non le reimposti esplicitamente.Come cancellare le variabili dopo l'esecuzione di ogni script batch?

Devo utilizzare setlocal e endlocal per assicurarmi che le variabili di una corsa non persistano su un'altra, senza chiudere il CMD?

risposta

13

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

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

Problemi correlati