9

バッチファイルを実行すると

setlocal
chdir ..

ディレクトリは変更されませんが、実行すると

setlocal
endlocal 
chdir ..

それは正常に動作します。これは、setlocal で期待されるものとまったく同じでなければなりません。ただし、環境変数がどのように表示されるかに関連する setlocal の定義を読むと、完全には明らかではありません。setlocal が実際に何を行い、なぜ chdir に干渉するのかを説明する良い機会になることを願っています。

4

2 に答える 2

6

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 なしではこれらの状態を制御できないのは残念です。環境をローカライズせずに、遅延拡張を有効または無効にできたらいいのにと思うことがよくあります。

于 2013-11-22T20:47:42.647 に答える