2011-08-04 42 views
5

Tôi có một tệp lô Windows khởi động các tệp lô khác. Làm cách nào để đợi tất cả các tệp lô khác hoàn thành trước khi thực hiện mọi thứ trong đợt đầu tiên? Tôi không thể sử dụng/chờ đợi vì tôi cần các lệnh khác để chạy song song.Đợi lệnh để kết thúc

+0

Bạn có thể đăng một số mã? Tôi không rõ vấn đề của bạn là gì. – steenhulthin

+0

bạn có sử dụng 'call ...' để khởi chạy các gói khác không? – woohoo

Trả lời

1

Đề xuất của tôi là sử dụng lệnh CALL. Một ví dụ từ Batch Files:

Batch1.bat niêm yết:

REM Batch1.bat 
SET ABC=1 
CALL BATCH2.BAT %ABC% 
ECHO ABC = %ABC% 
BATCH2.BAT %ABC% 
ECHO ABC = %ABC% 

nơi Batch2.bat niêm yết là:

REM Batch2.bat 
SET ABC=%ABC%%1 


EDIT: dựa trên phản hồi từ @Andriy M, ở đây là phiên bản được cải tiến cho hai lô:

Lô 1:

@ECHO OFF 
REM Batch1.bat 
SET ABC=1 
CALL batch2.bat %ABC% 
ECHO 1. ABC = %ABC% 
CALL batch2.bat %ABC% REM test this line with CALL and without 
ECHO 2. ABC = %ABC% 

Mẻ 2:

@ECHO OFF 
REM Batch2.bat 
SET tmout=5 
echo sleeping %tmout% seconds... 
REM this introduces a timeout by using a nonexistent ip address 
PING 1.2.1.2 -n 1 -w %tmout%000 > NUL 
echo done sleeping 
SET ABC=%ABC%%1 

Xem dòng trong batch1 nơi tôi đã viết những nhận xét thử nghiệm dòng này với CALL và không. Chạy lô đó hai lần, với dòng đó có CALL và không có CALL.

Kết quả của giao diện điều khiển mà khôngCALL:

C:\temp>batch1.bat 
sleeping 5 seconds... 
done sleeping 
1. ABC = 11 
sleeping 5 seconds... 
done sleeping 

Và bây giờ đầu ra từ console vớiCALL:

C:\temp>batch1.bat 
sleeping 5 seconds... 
done sleeping 
1. ABC = 11 
sleeping 5 seconds... 
done sleeping 
2. ABC = 1111 

Xin lưu ý sự khác biệt: chúng tôi nhận được tiếng vang 2, q.e.d.

+1

Đó là để nói, mà không GỌI nó chờ đợi cũng như với CALL, nhưng chỉ để… chấm dứt. :) –

+0

@Andriy M: Dựa trên những gì tôi đã trải nghiệm cho đến nay, đó là ** không ** như vậy, mà không cần GỌI - thực hiện trả về ngay lập tức cho dòng tiếp theo, mà không cần chờ đợi được gọi là batch/lệnh để kết thúc (có lẽ bạn nên thử điều đó với các hoạt động dài). – woohoo

+0

Điều đó thật kỳ lạ đến nỗi tôi phải xác minh kỳ vọng của mình bằng cách sử dụng các tập lệnh mẫu rất của bạn. Tôi chạy hàng loạt đầu tiên từ dấu nhắc lệnh trong Windows 7 SP1 của tôi và hai kịch bản đã làm việc cho tôi giống như tôi nghĩ họ sẽ, tức làviệc thực hiện chấm dứt sau khi 'batch2.bat' chấm dứt khi được gọi là lần thứ hai. Tức là, dòng cuối cùng của 'batch1.bat' không thực thi. Những gì bạn đã thử nghiệm chúng trên rằng bạn đang nói rằng không có CALL thực hiện trả về cho lô đầu tiên, và không phải chờ đợi quá? –

7

Bạn có thể sử dụng nhiều tệp cờ, mỗi tệp chạy mỗi tệp Hàng loạt. Ví dụ:

Đầu tiên batch file tạo Flagfile.1 khi nhập, và xóa nó trước khi kết thúc, và theo cùng một cách với phần còn lại của tập tin batch đồng thời (Flagfile.2, ...)

Các tập tin chính chỉ phải chờ tất cả các flagfiles biến mất. Ví dụ, trong tập tin chi tiết:

start Batch1 
start Batch2 
..... 
:wait 
if exist flagfile.* goto wait 

Trong bất kỳ tập tin hàng loạt, ví dụ Batch1:

echo %time% > flagfile.1 
echo Do my process... 
del flagfile.1 
exit 
+1

@ woohoo: Xin lỗi, tôi nghĩ có một sự hỗn loạn ở đây. Câu hỏi đặt ra là làm thế nào để chờ đợi cho tất cả các trẻ em song song hàng loạt để kết thúc trước khi tiếp tục một phụ huynh. Không có cách nào để giải quyết vấn đề này thông qua CALL, nhưng thông qua START. Khi người hỏi nói, anh ta không thể sử dụng/WAIT, đó là một tùy chọn của lệnh START. Giải pháp là triển khai một hệ thống semaphore cho phép tệp Batch của cha mẹ biết khi tất cả các con của nó kết thúc. Tôi đề xuất một hệ thống semaphore rất đơn giản dựa trên sự hiện diện của một tập tin, tuy nhiên, nên hoạt động hoàn hảo. Vì vậy, tại sao câu trả lời của tôi nhận được phiếu giảm giá? :-( – Aacini

+1

+1, Tại sao bỏ phiếu xuống thực sự, đặc biệt vì đây là câu trả lời duy nhất thực sự giải quyết câu hỏi.Để có tệp chính tạo flagfile. Kịch bản chính có thể bắt đầu thử nghiệm trước khi các tiến trình con hoàn tất khởi tạo. – dbenham

+0

TÌNH YÊU này! Trong VS, chúng tôi đã sử dụng 'CALL' trong mỗi sự kiện sau khi xây dựng của dự án dịch vụ để tải xuống tệp tham chiếu * .cs của mỗi người để lưu trữ trong một dự án khác có chứa tất cả tham chiếu assembly đơn giản. START/b/i' và thấy tôi có thể chạy tất cả cùng một lúc, cùng một cửa sổ, không ảnh hưởng lẫn nhau.Vì vậy, ngọt ngào, sau đó, tôi giống như heck tôi có thể sử dụng 'MSBuild' sau khi họ hoàn thành để xây dựng mà dự án dịch vụ để các dự án tham chiếu đến hội đồng của nó được cập nhật tự động. –

Các vấn đề liên quan