2012-09-25 32 views
13

Tôi có 4 tệp theo lô. Tôi muốn chạy đồng thời one.battwo.bat. Sau khi hoàn thành hai tệp hàng loạt này, three.batfour.bat sẽ chạy cùng một lúc, song song. Tôi đã cố gắng với nhiều cách nhưng mot hoạt động tốt.Đang đợi tập lệnh theo lô song song

Có ai có thể giúp tôi về điều này không?

Trả lời

3

Tạo tệp master.bat bắt đầu one.bat và two.bat. Khi one.bat và two.bat cuối một cách chính xác, chúng vang vọng nộp họ đã hoàn thành

if errorlevel 0 echo ok>c:\temp\OKONE 
if errorlevel 0 echo ok>c:\temp\OKTWO 

Sau đó master.bat chờ cho sự tồn tại của hai tập tin

del c:\temp\OKONE 
del c:\temp\OKTWO 
start one.bat 
start two.bat 
:waitloop 
if not exist c:\temp\OKONE (
    sleep 5 
    goto waitloop 
    ) 
if not exist c:\temp\OKTWO (
    sleep 5 
    goto waitloop 
    ) 
start three.bat 
start four.bat 

Một cách khác là cố gắng với cờ/WAIT

start /WAIT one.bat 
start /WAIT two.bat 

nhưng bạn không có bất kỳ sự kiểm soát nào về lỗi.

Dưới đây là một số tài liệu tham khảo

http://malektips.com/xp_dos_0002.html

http://ss64.com/nt/sleep.html

http://ss64.com/nt/start.html

+4

'bắt đầu/WAIT xxx' đợi xxx kết thúc trước khi cho phép thực thi chuyển sang dòng tiếp theo trong tệp lô. Vì vậy, 'one.bat' sẽ phải hoàn thành trước khi' two.bat' thậm chí có thể bắt đầu. Bạn có thể giả định rằng 'one.bat' sẽ luôn luôn kết thúc đầu tiên và sử dụng' start/wait two.bat', nhưng đó là một giả định. BTW, bạn không phải bắt đầu từ bốn.bat', bạn có thể chỉ cần gọi bốn.bat', (hoặc thậm chí bỏ qua 'call' nếu không có gì khác được thực hiện sau khi thực hiện' bốn.bat') và lưu bộ nhớ sẽ được sử dụng bằng cách khởi chạy một bộ xử lý lệnh khác. –

+0

Được đánh dấu là hữu ích cho cách tiếp cận được chia sẻ trước khi đề cập đến bắt đầu/WAIT. Ngoài ra hãy chắc chắn rằng bạn xóa các tập tin từ master.bat trước khi bạn bắt đầu one.bat và two.bat. –

+0

Cảm ơn bạn đã đề xuất, chỉnh sửa bài đăng cho phù hợp :-) –

14

này được thực hiện dễ dàng sử dụng một phiên bản đơn giản hóa nhiều của một giải pháp tôi cung cấp cho Parallel execution of shell processes. Tham khảo giải pháp đó để biết cách hoạt động của tệp khóa.

@echo off 
setlocal 
set "lock=%temp%\wait%random%.lock" 

:: Launch one and two asynchronously, with stream 9 redirected to a lock file. 
:: The lock file will remain locked until the script ends. 
start "" cmd /c 9>"%lock%1" one.bat 
start "" cmd /c 9>"%lock%2" two.bat 

:Wait for both scripts to finish (wait until lock files are no longer locked) 
1>nul 2>nul ping /n 2 ::1 
for %%N in (1 2) do (
    (rem 
) 9>"%lock%%%N" || goto :Wait 
) 2>nul 

::delete the lock files 
del "%lock%*" 

:: Launch three and four asynchronously 
start "" cmd /c three.bat 
start "" cmd /c four.bat 
+0

Điều này làm việc rất tốt cho nhu cầu của tôi. Cảm ơn bạn! Điều tôi cũng cần là đảm bảo các lệnh đó chạy thành công. Vì vậy, nó trông giống như: bắt đầu "" 9> "% khóa% 1" CMD/C "one.bat> one-log.txt 2> & 1 && echo success> one-success.txt" ... sau đó, đảm bảo rằng mỗi -success.Tệp txt tồn tại và nhập đầu ra từ mỗi -log.txt. – macetw

+0

@macetw tôi muốn xem giải pháp của bạn để kiểm tra sự thành công trong một khối mã để có thể đọc được. Bạn có thể chỉnh sửa câu trả lời ở trên hoặc gửi khối mã của bạn làm câu trả lời không? – SketchBookGames

+1

để chờ bạn có thể sử dụng ['1> nul 2> nul timeout 1' thay vì ping] (http://stackoverflow.com/q/1672338/995714) –

5

Tôi đã gặp tình trạng khó xử tương tự này. Đây là cách tôi giải quyết vấn đề này. tôi đã sử dụng lệnh tasklist để theo dõi xem quá trình này vẫn đang chạy hay không:

:Loop 
tasklist /fi "IMAGENAME eq <AAA>" /fi "Windowtitle eq <BBB>"|findstr /i /C:"<CCC>" >nul && (
timeout /t 3 
GOTO :Loop 
) 
echo one.bat has stopped 
pause 

Bạn sẽ cần phải tinh chỉnh các giá trị

<AAA>, <BBB>, <CCC>

trong kịch bản để nó lọc một cách chính xác cho quá trình của bạn.

Hy vọng điều đó sẽ hữu ích.

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