16

SET を使用してバッチ スクリプトで変数を宣言しているため、cmd で複数回実行すると、明示的にリセットしない限り、変数の値が保持されるようです。

CMD をシャットダウンせずに、setlocal と endlocal を使用して、ある実行の変数が別の実行に引き継がれないようにする必要がありますか?

4

1 に答える 1

21

はい、SETLOCAL を使用する必要があります。これにより、ENDLOCAL が発行されると古い環境が復元されるように、変更がローカライズされます。

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

また、スクリプト (またはルーチン) が CALL された場合、CALL が完了すると、CALL されたルーチン内で発行されたアクティブな 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

CALL されたルーチン内の 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
于 2012-12-05T16:52:33.023 に答える