2

重複の可能性:
環境変数を有効にする ENDLOCAL
「遅延拡張ローカル」モードを使用する Windows バッチ スクリプトの外部で変数の値を保持する方法は?

次のようなバッチファイルがあります。

REM I need to use SETLOCAL so as not to pollute the environment
REM with any variables used to implement the logic in this script
SETLOCAL
SET I_DONT_WANT_THIS_VARIABLE_TO_LEAK_OUTSIDE=c:\

REM BUT, there is this one change to the environment I want to make sticky:
PATH %PATH%;%I_DONT_WANT_THIS_VARIABLE_TO_LEAK_OUTSIDE%

スクリプトは、バッチ ファイルが実行SETLOCALたいことから環境を分離するために使用しますが、これは問題を引き起こします。バッチ ファイルが終了します)。また、パスを設定する前に呼び出すこともできません。これは、環境を元の状態に復元し、変数の値を一掃して、その値をパスに追加できないためです。SETLOCALENDLOCAL

効果を無視してパスを設定する方法はありSETLOCALますか? または、呼び出し時に変数の値が消去されないように明示的に保持するトリックはありますENDLOCALか?

一時ファイルをバリアをバイパスできる容器として使用できることは承知していますENDLOCALが、より洗練されたソリューションを歓迎します。

4

1 に答える 1

5

これをスクリプトの最後 (または戻る直前) に追加します。

endlocal & @set path=%path%

これが機能する理由は、cmd パーサーが環境変数の展開を行全体に実行してから実行するためです。したがって、endlocal実行するまでに、cmd処理中の行は次のようになります。

endlocal & @set path=c:\whatever\the;c:\new\path;c:\is

次にendlocal、すべてのローカル変更を破棄しますが、パスに加えられた変更は、set実行しようとしているコマンドに一時的に保存されています。

于 2013-01-26T22:57:11.830 に答える