2012-12-05 16 views
10

私はバッチスクリプトで私の変数を宣言するためにSETを使うので、cmdで複数回実行すると明示的にリセットしない限り変数の値は保持されます。各バッチスクリプトの実行後に変数をクリアする方法は?

CMDをシャットダウンせずに、1つの実行の変数が別のものに持続しないようにするには、setlocalとendlocalを使用する必要がありますか?

答えて

13

はい、SETLOCALを使用してください。 ENDLOCALが発行されると、古い環境が復元されるような変更がローカライズされます。

すべてのスクリプト処理が完了し、コマンドラインコンテキストに戻されると、アクティブなSETLOCALごとに暗黙のENDLOCALが発行されます。 ENDLOCALを明示的に発行する必要はありません。

また、スクリプト(またはルーチン)がCALLされている場合、CALLが完了すると、CALLedルーチン内で発行されたすべてのアクティブなSETLOCALに対して暗黙のENDLOCALがあります。 (それは悪くはないが)ルーチンの最後でENDLOCALを配置する必要があり、

ませ例えば

@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 

出力:呼び出されたルーチン内の

var=pre-CALL value 
var=within CALL value 
var=pre-CALL value 

ENDLOCALはロールバックすることはありませんCALLの前に発行されたSETLOCAL。例えば。

@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 

結果:実行が完了すると

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

私が見...右SETLOCAL後ので、基本的にすべてのSET操作がクリアされます。私はそれを試してみましょう。これは変数を自分でクリアするのに勝つ。 – ttback

関連する問題