Mengapa hanya baris pertama file batch Windows ini yang dieksekusi tetapi ketiga baris mengeksekusi dalam shell perintah?

171

Saya memiliki file batch yang menjalankan tiga perintah Maven, satu demi satu. Setiap perintah dapat berhasil dieksekusi dalam skrip - dengan sendirinya !. Tetapi ketika saya menambahkan ketiga perintah ke file yang sama, hanya yang pertama dieksekusi sebelum skrip keluar. Ada yang tahu kenapa?

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

Juga, jika saya menyalin ketiga perintah dan menempelkannya ke shell perintah (cmd.exe), mereka mengeksekusi satu demi satu tanpa masalah. Jadi ini rupanya beberapa masalah dengan file batch.

wiki
sumber
2
Benar-benar kebetulan: Saya datang ke sini dengan masalah yang sama dan juga perintah yang sama dalam file batch saya - beberapa baris "mvn install: install-file" :-D
fishbone
Kemungkinan duplikat dari Bagaimana menjalankan beberapa file .BAT dalam file .BAT
Peter Mortensen
1
@fishbone dan secara kebetulan Anda dan OP sama-sama memiliki reputasi 1.3k ..
p_champ

Jawaban:

297

Maven menggunakan file batch untuk melakukan bisnisnya. Dengan skrip batch apa pun, Anda harus memanggil skrip lain menggunakan callperintah sehingga ia tahu untuk kembali ke skrip Anda setelah skrip yang dipanggil selesai. Coba tambahkan dulu callke semua perintah.

Hal lain yang bisa Anda coba adalah menggunakan startperintah yang harus bekerja sama.

Jeff Mercado
sumber
1
Saya telah memasukkan antfile batch windows sebelumnya dan callharus antdijalankan. Tanpa callbatch akan berhenti setelah perintah pertama, maka yang kedua tidak akan dieksekusi. microsoft.com/resources/documentation/windows/xp/all/proddocs/… untuk info lebih lanjut tentangcall
Owen
22
startakan menyebabkan jendela baru muncul, dan masing-masing dari tiga perintah akan berjalan secara paralel. Jika Anda membutuhkannya untuk berjalan secara sinkron, gunakan call.
akf
11
Bagaimana mungkin masuk akal bagi lingkungan scripting untuk berperilaku seperti ini? Jika saya telah menulis skrip dengan dua perintah, saya berharap perintah akan dieksekusi; Saya tidak berharap lingkungan hanya memutuskan untuk berhenti mengeksekusi skrip saya hanya karena salah satu dari perintah itu kebetulan diimplementasikan sebagai skrip itu sendiri.
bames53
3
@ bames53: ini adalah batasan yang berasal dari DOS yang dibawa ke implementasi modern dari command prompt di Windows. Karena tujuan Microsoft adalah menjaga kompatibilitas, ini adalah hasilnya.
Jeff Mercado
2
tambahkan call pausedi akhir (tanpa tanda kutip) jika Anda ingin tetap membuka jendela cmd
JinSnow
28

Setelah callmembantu. Namun hari ini tidak.

Inilah cara saya menyelesaikannya:

Isi file bat (jika Anda ingin menghentikan batch ketika salah satu cmds kesalahan)

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

Isi file bat (jika Anda ingin melanjutkan batch ketika salah satu cmds kesalahan)

cmd1 & ^
cmd2 & ^
cmd3 & ^
cmd4
Manohar Reddy Poreddy
sumber
(Contoh pertama di sini setara dengan cmd1 && cmd2 && cmd3 && cmd4, pada dasarnya membuat semua perintah satu baris.)
Ben Gotow
2
Benar. Saya menulis seperti itu karena ini adalah file bat, sebagian besar Anda akan memiliki banyak, mungkin perintah yang panjang, 4 perintah dalam satu baris tidak akan baik dalam pemeliharaan di masa depan. Keterbacaan adalah kunci dalam menulis program yang baik dan karena itu ada di jalur yang berbeda.
Manohar Reddy Poreddy
1
Solusi ini membantu saya. The callsolusi tidak berhenti di kesalahan, yang satu ini tidak.
Tim
9

Untuk menjalankan lebih banyak build Maven dari satu skrip, Anda harus menggunakan fungsi panggilan Windows dengan cara berikut:

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
Seweryn Habdank-Wojewódzki
sumber
1

Seharusnya mvnperintah khusus execdan tidak kembali, dengan demikian tidak menjalankan sisa perintah.

Alan Haggai Alavi
sumber
Apakah ada cara untuk memaksa skrip untuk menjalankan mvnperintah berikutnya ?
wiki
1

Coba tulis file batch berikut dan jalankan:

Echo one
cmd
Echo two
cmd
Echo three
cmd

Hanya dua baris pertama yang dieksekusi. Tetapi jika Anda mengetik "keluar" pada prompt perintah, dua baris berikutnya diproses. Ini adalah shell yang memuat yang lain.

Untuk memastikan bahwa ini bukan yang terjadi pada skrip Anda, cukup ketik "keluar" ketika perintah pertama berakhir.

HTH!

Belisarius
sumber
Tidak sepertinya; Maven memang menggunakan file batch yang mengapa mereka perlu menggunakan call. Itu bukan shell bersarang yang tidak diakhiri.
Joey