私はバッチスクリプトで私の変数を宣言するためにSETを使うので、cmdで複数回実行すると明示的にリセットしない限り変数の値は保持されます。各バッチスクリプトの実行後に変数をクリアする方法は?
CMDをシャットダウンせずに、1つの実行の変数が別のものに持続しないようにするには、setlocalとendlocalを使用する必要がありますか?
私はバッチスクリプトで私の変数を宣言するためにSETを使うので、cmdで複数回実行すると明示的にリセットしない限り変数の値は保持されます。各バッチスクリプトの実行後に変数をクリアする方法は?
CMDをシャットダウンせずに、1つの実行の変数が別のものに持続しないようにするには、setlocalとendlocalを使用する必要がありますか?
はい、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
私が見...右SETLOCAL後ので、基本的にすべてのSET操作がクリアされます。私はそれを試してみましょう。これは変数を自分でクリアするのに勝つ。 – ttback