Thực thi nhiều lệnh từ tập lệnh cmd của Windows


136

Tôi đang cố gắng viết một kịch bản lệnh cmd của Windows để thực hiện một số tác vụ theo chuỗi. Tuy nhiên, nó luôn dừng sau lệnh đầu tiên trong tập lệnh.

Lệnh mà nó dừng sau là một bản dựng maven (không chắc nó có liên quan không).

Làm thế nào để tôi thực hiện nó và thực hiện lần lượt từng nhiệm vụ?

Cài đặt bất kỳ phần mềm hoặc cấu hình sổ đăng ký, v.v ... hoàn toàn không có vấn đề gì - nó phải hoạt động trên bản cài đặt Windows XP vanilla.

Lý tưởng nhất là tôi muốn hủy bỏ kịch bản nếu bất kỳ lệnh nào thất bại, nhưng đó là "tốt để có", không cần thiết.

Cảm ơn.

Câu trả lời:


139

Khi bạn gọi một tệp .bat khác, tôi nghĩ bạn cần "gọi" trước cuộc gọi:

call otherCommand.bat

1
Xin chào, trong tập lệnh gốc tôi đã không gọi các tệp .cmd khác, nhưng tôi đã chia nó thành các tệp riêng biệt để tôi có thể chạy lần lượt từng tệp. Vì vậy, đặt cuộc gọi trước mỗi lệnh dường như đã thực hiện thủ thuật, cảm ơn!
Darren Greaves

5
Như một vấn đề thực tế, trên Windows, mvnlà một tệp .bat, do đó bạn cần sử dụng callnó như trong call mvn install; thông thường bạn không cần tạo thêm một tập tin cmd.
jfpoilpret

2
Lưu ý rằng bạn không cần dấu chấm phẩy trong các tệp bó. Và lý do tại sao bạn cần sử dụng cuộc gọi là vì chính mvn là một tệp bó và các tệp bó cần gọi nhau bằng cuộc gọi, nếu không thì điều khiển không trả về cho người gọi.
Pushkar

@Gulzar Nazim - Bạn có biết nếu tôi có thể đặt tất cả các lệnh trong một tệp bó với câu lệnh if-other không vì tôi không muốn duy trì nó trong các tệp bó khác nhau?
Ng2-Vui

1
Tôi đã cố gắng làm một cái gì đó tương tự với các npmbản cập nhật và protractorthử nghiệm. Tôi không nghĩ câu trả lời này được áp dụng cho tôi cho đến khi tôi nhận ra npmprotractor.cmdcác tệp trên Windows.
joshden

45

Bạn chỉ có thể sử dụng biểu tượng && giữa các lệnh để thực thi lệnh thứ hai nếu lệnh đầu tiên thành công. Thêm thông tin ở đây http://commandwindows.com/command1.htm


Cảm ơn, tôi sẽ thử cùng với câu trả lời được chấp nhận ở trên.
Darren Greaves

Điều này sẽ dừng việc thực thi tập lệnh thứ hai nếu việc xây dựng maven không thành công?
Varun Achar

Liên kết đó bị hỏng: "Máy chủ cuối cùng không phản hồi kịp thời. Máy chủ ứng dụng quá bận và không thể xử lý kịp thời các yêu cầu."
kevinji

1
@TheM Windows phân biệt giữa các ứng dụng dựa trên GUI và dựa trên lệnh (có một cờ ở gần đầu tệp EXE). Nếu bạn khởi động một ứng dụng dựa trên GUI từ dòng lệnh, nó luôn xuất hiện để kết thúc ngay lập tức vì nó hoàn toàn tách rời khỏi dòng lệnh. Nếu bạn khởi động chương trình dựa trên lệnh từ chương trình GUI (như Explorer), nó sẽ luôn hiển thị một dòng lệnh mới. Các hệ thống POSIX không có sự phân biệt như vậy do đó hành vi phù hợp hơn.
coderforlife

2
@TheM Để giải quyết vấn đề này, bạn có thể sử dụngstart /B /WAIT calc
coderforlife

25

Không chắc chắn tại sao lệnh đầu tiên dừng lại. Nếu bạn có thể làm cho nó song song, bạn có thể thử một cái gì đó như

start cmd.exe /C 1.bat      
start cmd.exe /C 2.bat

7
Sử dụng /Kthay vì /Cnếu bạn muốn shell vẫn mở sau khi lệnh của bạn được thực thi.
JellicleCat

Không cần sử dụng cmd.exestart, chỉ cần start x.bat1làm.
user66001

23

Tôi vừa mới thực hiện chính xác nhiệm vụ (ish) là tạo tập lệnh bó để chạy tập lệnh kiểm tra maven. Vấn đề là việc gọi maven scrips với mvn clean install ... bản thân nó là một tập lệnh và vì vậy cần phải thực hiện với cuộc gọi cài đặt sạch mvn.

Mã sẽ hoạt động

rem run a maven clean install
cd C:\rbe-ui-test-suite 
call mvn clean install
rem now run through all the test scripts
call mvn clean install -Prun-integration-tests -Dpattern=tc-login
call mvn clean install -Prun-integration-tests -Dpattern=login-1

Lưu ý thay vì sử dụng cuộc gọi. Điều này sẽ cho phép sử dụng các tập lệnh maven liên tiếp trong tệp bó.


5

Sử dụng ký hiệu kép sẽ chạy lệnh thứ hai, chỉ khi lệnh thứ nhất thành công:

cd Desktop/project-directory && atom .

Trong trường hợp, chỉ sử dụng một ký hiệu và sẽ cố chạy cả hai lệnh, ngay cả khi lệnh đầu tiên không thành công:

cd Desktop/project-directory & atom .

1

Nếu bạn đang chạy trong Windows, bạn có thể sử dụng lệnh sau.

Lái xe:

cd "Script location"
schtasks /run /tn "TASK1"
schtasks /run /tn "TASK2"
schtasks /run /tn "TASK3"
exit

1

Tôi không biết câu trả lời trực tiếp cho câu hỏi của bạn, nhưng nếu bạn thực hiện nhiều kịch bản này, có thể đáng để học một ngôn ngữ mạnh hơn như perl. Triển khai miễn phí tồn tại cho Windows (ví dụ: activestate, cygwin). Tôi đã thấy nó xứng đáng với nỗ lực ban đầu cho các nhiệm vụ của riêng tôi.

Biên tập:

Theo đề xuất của @Ferruccio, nếu bạn không thể cài đặt phần mềm bổ sung, hãy xem xét vbscript và / hoặc javascript. Chúng được tích hợp vào máy chủ Windows scripting.


Cảm ơn nhưng tôi không thể cài đặt bất kỳ phần mềm. Tôi ước tôi có quyền truy cập vào một cái gì đó mạnh mẽ hơn ngôn ngữ kịch bản Windows nhảm nhí. :-(
Darren Greaves

6
Bạn luôn có thể sử dụng vbscript hoặc javascript. Chúng được tích hợp vào máy chủ Windows scripting.
Ferruccio

0

Lưu ý rằng bạn không cần dấu chấm phẩy trong các tệp bó. Và lý do tại sao bạn cần sử dụng cuộc gọi là vì chính mvn là một tệp bó và các tệp bó cần gọi nhau bằng cuộc gọi, nếu không thì điều khiển không trả về cho người gọi.

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.