SETLOCAL (help setlocal
またはsetlocal /?
) の HELP ドキュメントでは、実際に状況がかなりよく説明されています。明らかでない唯一のことは、「環境変更のローカリゼーション」には環境変数だけでなく、現在のディレクトリ、および遅延展開と拡張状態も含まれていることです。他にもあるかもしれませんが、現時点では思いつきません。
あなたをつまずかせていることは、実際にはかなりよく説明されています。サブルーチンと呼ばれます。
バッチ スクリプトが終了すると、暗黙の ENDLOCAL によって CHDIR の効果が「消去」されます。2 番目のコードで明示的な ENDLOCAL を使用すると、ルート環境に戻るため、CHDIR が保持されます。
アップデート
通常は を使用して現在の値を取得できますが、現在のディレクトリは環境変数ではありません%CD%
。あなたはそれを証明することができますSET CD
-おそらく「環境変数CDが定義されていません」というメッセージが表示されます。を使用して独自の真の CD 変数を明示的に定義するset "CD=some value"
と%CD%
、現在のディレクトリではなく、割り当てた値が返されます。
元の SETLOCAL コマンドは、古い COMMAND.COM の時代には、拡張の遅延や拡張を制御していませんでした。CMD.EXE が導入されたときに、Enable/Disable DelayedExpansion および Enable/Disable Extensions オプションが追加されました。これは、MS がこの機能を実装することを決定した方法です。そうである必要はありませんでした。多くの点で、SETLOCAL/ENDLOCAL なしではこれらの状態を制御できないのは残念です。環境をローカライズせずに、遅延拡張を有効または無効にできたらいいのにと思うことがよくあります。