このWindowsバッチファイルの最初の行だけが実行されるのに、3行すべてがコマンドシェルで実行されるのはなぜですか?


171

3つのMavenコマンドを順番に実行するバッチファイルがあります。各コマンドは、スクリプト自体で正常に実行できます。しかし、3つのコマンドすべてを同じファイルに追加すると、スクリプトが終了する前に最初のコマンドのみが実行されます。なぜだと思いますか?

mvn install:install-file -DgroupId=gdata -DartifactId=base -Dversion=1.0 -Dfile=gdata-base-1.0.jar  -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -DgroupId=gdata -DartifactId=blogger -Dversion=2.0 -Dfile=gdata-blogger-2.0.jar  -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -DgroupId=gdata -DartifactId=blogger-meta -Dversion=2.0 -Dfile=gdata-blogger-meta-2.0.jar  -Dpackaging=jar -DgeneratePom=true

また、3つのコマンドをすべてコピーしてコマンドシェル(cmd.exe)に貼り付けると、問題なく次々に実行されます。したがって、これは明らかにdosバッチファイルの一部の問題です。


2
なんと偶然の一致です。バッチファイルで同じ問題と同じコマンドを使用してここに来ました-"mvn install:install-file"の複数行:-D
fishbone


1
@fishboneと偶然あなたとOPは1.3Kの評判を持って、両方の...
p_champ

回答:


297

Mavenはバッチファイルを使用してビジネスを行っています。バッチスクリプトでは、callコマンドを使用して別のスクリプトを呼び出して、呼び出されたスクリプトが完了した後にスクリプトに戻ることがわかるようにする必要があります。callすべてのコマンドの先頭に追加してください。

あなたが試すことができる別のことは、start同様に機能するはずのコマンドを使用することです。


1
私はant以前にWindowsバッチファイル内に配置callしたことがありant、実行するには取得する必要がありました。callバッチがないと、最初のコマンドの後で停止するため、2番目の2つは実行されません。 詳細については、microsoft.com / call
Owen

22
start新しいウィンドウが生成され、3つのコマンドがそれぞれ並行して実行されます。同期して実行する必要がある場合は、を使用してくださいcall
akf

11
スクリプト環境がこのように動作することは、一体どういう意味ですか。2つのコマンドでスクリプトを記述した場合、コマンドが実行されることを期待しています。これらのコマンドの1つがたまたまスクリプト自体として実装されているからといって、単に環境がスクリプトの実行を停止することを決定するとは思いません。
bames53 2013

3
@ bames53:これは、Windowsのコマンドプロンプトの最新の実装に引き継がれたDOSに起因する制限です。Microsoftの目標は下位互換性を維持することであったため、これが結果です。
ジェフメルカド

2
call pause
コマンド

28

持つcallことができます。しかし、今日はそうではありませんでした。

これは私がそれを解決した方法です:

Batファイルの内容(cmdsエラーの1つでバッチを停止する場合)

cmd1 && ^
cmd2 && ^
cmd3 && ^
cmd4

Batファイルの内容(cmdsエラーの1つが発生したときにバッチを続行する場合)

cmd1 & ^
cmd2 & ^
cmd3 & ^
cmd4

(ここでの最初の例はに相当しcmd1 && cmd2 && cmd3 && cmd4、基本的にすべてのコマンドを1行にします。)
Ben Gotow

2
そうだね。私がそのように書いたのはbatファイルであるため、ほとんどの場合、複数の、場合によっては長いコマンドがあり、1行に4つのコマンドがあると、将来のメンテナンスに適さなくなります。読みやすさは優れたプログラムを作成する上で重要であるため、それらは別の行にあります。
Manohar Reddy Poreddy、2018

1
この解決策は私にとってはうまくいった。call解決策は、エラーで停止していなかった、これはありません。
Tim

9

1つのスクリプトからさらに多くのMavenビルドを実行するには、Windowsの呼び出し関数を次のように使用します。

call mvn install:install-file -DgroupId=gdata -DartifactId=base -Dversion=1.0 -Dfile=gdata-base-1.0.jar  -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -DgroupId=gdata -DartifactId=blogger -Dversion=2.0 -Dfile=gdata-blogger-2.0.jar  -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -DgroupId=gdata -DartifactId=blogger-meta -Dversion=2.0 -Dfile=gdata-blogger-meta-2.0.jar  -Dpackaging=jar -DgeneratePom=true

1

特定のmvnコマンドexecが返されないため、残りのコマンドは実行されないはずです。


スクリプトに次のmvnコマンドを実行させる方法はありますか?
wiki

1

次のバッチファイルに書き込んで実行してみてください。

Echo one
cmd
Echo two
cmd
Echo three
cmd

最初の2行だけが実行されます。ただし、コマンドプロンプトで「exit」と入力すると、次の2行が処理されます。それは別のものをロードするシェルです。

これがスクリプトで起こっていることではないことを確認するには、最初のコマンドが終了したときに「exit」と入力します。

HTH!


ありそうもない。Mavenは実際にバッチファイルを使用するため、使用する必要がありますcall。終了していないのはネストされたシェルではありません。
Joey、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.