(詳細はあなたの質問から欠落しているいくつかの推測を作る)
、バッチスクリプトが環境を変更するとき、デフォルトの動作は、それを実行しているCMDプロセスの環境を変更することです。
別のバッチスクリプトを呼び出すバッチスクリプトがある場合は、3つの方法があります。
直接バッチファイルを実行します。
REM call q.bat
q.bat
REM this line never runs
それが呼び出すバッチスクリプトに戻りませんので、通常、あなたが、これを望んでいません。これはよりgoto
のようなものです。 CMDプロセスはあるスクリプトから別のスクリプトに切り替えるだけです。
はcall
で実行します。
REM call q.bat
CALL q.bat
REM changes that q.bat affects will appear here.
これは別のものを呼び出すための1つのバッチファイルのための最も一般的な方法です。 q.bat
が終了すると、制御は呼び出し元に戻ります。これは同じCMDプロセスなので、環境への変更はまだそこにあります。
注:q.bat
がEXIT
ステートメントを使用すると、呼び出し元のスクリプトに制御を戻すことなく、CMDプロセスが終了することがあります。
注2:がEXIT /B
を使用する場合、CMDプロセスは終了しません。これはERRORLEVEL
を設定するのに便利です。新しいCMDプロセスで
実行します。q.bat実行が新しいCMDプロセスをINS
REM call q.bat
CMD /C q.bat
REM environment changes in q.bat don't affect me
ので、それはそのプロセスの環境に影響を与え、そしてCMDは、発信者がで実行されていないことを
注意:q.bat
がEXIT
を使用する場合、呼び出し元のプロセスは終了しません。
SETLOCAL
CMDコマンドは、現在のスクリプトのための新しい環境を作成します。その環境の変更は呼び出し側に影響しません。偶発的な環境変化のリークを防ぐため、一般的にはSETLOCAL
が良い方法です。これは、親環境へのXとYの値をプッシュします
ENDLOCAL && SET X=%X% && SET Y=%Y%
:SETLOCAL
を使用して、まだ呼び出し元のスクリプトに環境の変化をプッシュする、とスクリプトを終了する
。
あなたが別のプロセス(ないCMDスクリプト)を実行すると、それはツールが必要な変更を行い、バッチファイルを生成持っているよりも、現在のスクリプトの環境に影響を与えてい一方であれば、実行そのバッチファイル。
REM q.exe will write %TEMP%\runme.cmd, which looks like:
REM set X=Y
q.exe
call "%TEMP%\runme.cmd"
使用しているシェルを特定してください。 CMDは私の最高の推測ですが、多分あなたはPowerShellまたはCSHのWindowsポートを意味します。 –