2016-09-22 2 views
0

私は.batというファイルを作成しましたが、一連の手順は実行されません。これは、最新の実行コマンドのセクションです:すべてのコマンドが実行される前にWindowsバッチ.batが終了しました

gem update --system 
gem install --no-ri --no-rdoc bundle 
gem install --no-ri --no-rdoc bundler 
bundle install 
echo EVERYTHING OK 
echo Configuring DB 

最初のコマンドは、このことを示し、その後、プログラムを終了する:

Latest version currently installed. Aborting. 

だから私は単一のもので、すべてのこれらのコマンドを実行しようとした:

gem update --system & gem ..... & bundle install & echo THIS IS PRINTED OK 
echo THIS IS NOT PRINTED 

最後のエコーが印刷されない理由は理解できませんが、すべてのコマンドは&で動作します。

+1

'gem'はバッチファイルですか? – aschipfl

答えて

0

バッチファイルに別のバッチファイルであるコマンドが含まれている場合、バッチプロセッサはそれを現在のバッチファイルを指定されたバッチファイルに置き換える指示として解釈します。この動作はMS-DOSの暗い時から来ますが、下位互換性のために保持されています。 (また、おそらく、バッチプロセッサがまだ存在している唯一の理由はどれ!)

あなたが他のバッチファイルを実行し、を継続したい場合は、あなたがcallコマンドを使用する必要があり、例えば、

call gem update 

最高結果、子プロセスでそれを実行するまで、あなたが呼んでいるバッチファイルから無の状態が漏れていることを確実にするために:

cmd /c gem update 

(むしろunfoですIMO、gemは適切な実行可能ファイルではなく、バッチファイルです)。

1

コマンドがバッチファイルで実行されるたびに、実行フローの制御が子プロセスに渡されます。

はこれを避けるために、我々は、各コマンドの前に CALLの前に付ける必要があります。echoが実行される前に、コマンドが終了しているよう

call gem update --system 
call gem install --no-ri --no-rdoc bundle 
call gem install --no-ri --no-rdoc bundler 
call bundle install 

echo EVERYTHING OK 
echo Configuring DB 
+2

ECHOステートメントの前にCALLは必要ありません。 – Squashman

+0

正しい解決方法がありますが、間違った説明があります。バッチファイルから通常の実行可能ファイルを実行すると、コマンドインタプリタはそれを実行する子プロセスを作成し、期待どおりに動作します。その場合は 'call'の必要はありません。他のバッチファイルを実行しているときに 'call'する必要があるのは、その場合には*子プロセスが存在しないからです。コマンドインタプリタは、ジョブを子プロセスに渡すことなく、バッチファイル自体を実行します。デフォルトでは、元のバッチファイルには戻ってこないので(歴史的な理由から)、 'call'する必要があります。 –

1

が見えます。 スクリプトの各コマンドの前にCALLコマンドを使用してください。

+0

詳細情報http://ss64.com/nt/exit.html – soundslikeodd

関連する問題