Tại sao chỉ dòng đầu tiên của tệp bó Windows này thực thi nhưng cả ba dòng thực thi trong một vỏ lệnh?


171

Tôi có một tệp bó thực thi ba lệnh Maven, lần lượt từng lệnh. Mỗi lệnh có thể được thực hiện thành công trong tập lệnh - bằng chính nó!. Nhưng khi tôi thêm cả ba lệnh vào cùng một tệp, chỉ lệnh đầu tiên thực thi trước khi tập lệnh thoát. Bất cứ ý tưởng tại sao?

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

Ngoài ra, nếu tôi sao chép cả ba lệnh và dán chúng vào shell lệnh (cmd.exe), chúng sẽ thực thi lần lượt từng lệnh mà không gặp vấn đề gì. Vì vậy, đây rõ ràng là một số vấn đề với tập tin dos dos.


2
Thật là một sự trùng hợp ngẫu nhiên: Tôi đến đây với cùng một vấn đề và cũng các lệnh tương tự trong tệp bó của tôi - nhiều dòng "mvn install: install-file" :-D
xương cá


1
@ fishfish và trùng hợp là cả bạn và OP đều có danh tiếng 1,3k ..
p_champ

Câu trả lời:


297

Maven sử dụng các tệp bó để thực hiện công việc của mình. Với bất kỳ tập lệnh bó nào, bạn phải gọi một tập lệnh khác bằng calllệnh để nó biết quay lại tập lệnh của bạn sau khi tập lệnh được gọi hoàn thành. Hãy thử chuẩn bị callcho tất cả các lệnh.

Một điều khác bạn có thể thử là sử dụng startlệnh sẽ hoạt động tương tự.


1
Tôi đã đặt antbên trong các tệp bó của windows trước đó và callyêu cầu bắt buộc antphải thực thi. Không có calllô sẽ dừng sau lệnh đầu tiên, do đó hai thứ hai không thực thi. microsoft.com/resource/documentation/windows/xp/all/proddocs/ cấp để biết thêm thông tin vềcall
Owen

22
startsẽ khiến một cửa sổ mới sinh ra và mỗi trong ba lệnh sẽ chạy song song. Nếu bạn cần chúng để chạy đồng bộ, hãy sử dụng call.
akf

11
Làm thế nào trên trái đất có ý nghĩa cho một môi trường kịch bản để hành xử theo cách này? Nếu tôi đã viết một tập lệnh với hai lệnh, tôi hy vọng các lệnh sẽ được thực thi; Tôi không mong đợi môi trường sẽ quyết định ngừng thực thi tập lệnh của mình chỉ vì một trong những lệnh đó được thực hiện dưới dạng tập lệnh.
bames53

3
@ bames53: đây là một hạn chế bắt nguồn từ DOS mang đến các triển khai hiện đại của dấu nhắc lệnh trong Windows. Vì các mục tiêu của Microsoft là duy trì khả năng tương thích ngược, đây là kết quả.
Jeff Mercado

2
thêm call pausevào cuối (không có dấu ngoặc kép) nếu bạn muốn giữ cho các cửa sổ cmd mở
JinSnow

28

callgiúp. Tuy nhiên ngày nay thì không.

Đây là cách tôi giải quyết nó:

Nội dung tệp Bat (nếu bạn muốn dừng lô khi một trong các lỗi cmds)

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

Nội dung tệp Bat (nếu bạn muốn tiếp tục lô khi một trong các lỗi cmds)

cmd1 & ^
cmd2 & ^
cmd3 & ^
cmd4

(Ví dụ đầu tiên ở đây tương đương với cmd1 && cmd2 && cmd3 && cmd4, về cơ bản thực hiện tất cả các lệnh một dòng.)
Ben Gotow

2
Thật. Tôi đã viết nó theo cách đó bởi vì là một tập tin bat, chủ yếu là bạn sẽ có nhiều lệnh, có thể dài, 4 lệnh trong một dòng sẽ không tốt trong bảo trì trong tương lai. Khả năng đọc là chìa khóa trong việc viết các chương trình tốt và vì vậy chúng nằm trên các dòng khác nhau.
Manohar Reddy Poreddy

1
Giải pháp này đã lừa tôi. Các callgiải pháp đã không dừng lại ở lỗi, chương trình này không.
Tim

9

Để thực thi nhiều bản dựng Maven hơn từ một tập lệnh, bạn sẽ sử dụng chức năng gọi Windows theo cách sau:

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

Nó nên là các mvnlệnh cụ thể execs và không trả về, do đó không thực hiện phần còn lại của các lệnh.


Có cách nào để buộc tập lệnh thực thi mvnlệnh tiếp theo không?
wiki

1

Hãy thử viết tệp bó sau đây và thực hiện nó:

Echo one
cmd
Echo two
cmd
Echo three
cmd

Chỉ có hai dòng đầu tiên được thực hiện. Nhưng nếu bạn gõ "exit" tại dấu nhắc lệnh, hai dòng tiếp theo sẽ được xử lý. Đó là một cái vỏ đang tải cái khác.

Để chắc chắn rằng đây không phải là những gì đang xảy ra trong tập lệnh của bạn, chỉ cần gõ "exit" khi lệnh đầu tiên kết thúc.

HTH!


Không có khả năng; Maven thực sự sử dụng một tệp bó đó là lý do tại sao họ cần sử dụng call. Nó không phải là một cái vỏ lồng nhau không bị chấm dứt.
Joey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.