Chạy nhiều quy trình nền đồng thời, sau đó đợi tất cả chúng kết thúc, trên Windows


14

Bất cứ ai cũng biết nếu có kịch bản cmd thực hiện điều đó và / hoặc một công cụ dòng lệnh đã sẵn sàng cho công việc?


Làm như vậy có thể gây hại cho dữ liệu của bạn!
Santosh Kumar

8
@Santosh: ý của bạn là "có thể gây hại cho dữ liệu của bạn"? Trong trường hợp cụ thể của tôi, các tác vụ nền sẽ xử lý các tập dữ liệu độc lập của riêng chúng. Không có rủi ro sửa đổi đồng thời.
Sergio

1
Từ phía API Win32, tôi nghĩ WaitForMult MônObjects với bWaitAll = TRUE sẽ thực hiện công việc. Sẽ không khó để viết một chương trình chỉ loại bỏ các chương trình được đưa ra trong một số tệp đầu vào, nếu không có câu trả lời thỏa mãn.
dùng1686

1
@grawity: vâng, tôi dự định làm điều đó nếu không có gì xuất hiện (và đăng mã ở đây), nhưng hãy xem liệu tôi có thể tránh phát minh lại bánh xe không :)
Sergio

Phát minh lại bánh xe là một điều tốt nếu các bánh xe hiện tại có hình vuông ...
user1686

Câu trả lời:


10

Tạo ba tệp bó bên dưới. Main.bat ra mắt 1.bat và 2.bat

1.bat và 2.bat ghi ra các tệp tạm thời để kiểm tra main.bat. Trong khi 1.bat và 2.bat đang hoạt động, main.bat báo cáo lại rằng quá trình xử lý vẫn đang diễn ra. Khi bạn nhấn enter trên cửa sổ mở 1.bat hoặc 2.bat, tệp tạm thời sẽ bị xóa và chương trình thoát. Điều này mô phỏng dừng xử lý cho tập tin .bat đó. Nếu bạn làm điều này cho cả 1 và 2.bat, main.bat báo cáo với bạn rằng quá trình xử lý đã hoàn tất cho các quy trình này. Bạn có thể thực hiện 1.bat và 2.bat làm bất cứ điều gì bạn muốn, miễn là bạn xóa tệp tạm thời khi bạn kết thúc. Tại thời điểm này, main.bat có thể làm bất cứ điều gì bạn muốn.

1.bat

echo %time% > 1.tmp
pause
del 1.tmp
exit 

2.bat

echo %time% > 2.tmp
pause
del 2.tmp
exit

chính

@echo off
start "1" 1.bat
start "2" 2.bat
    @ping -n 1 127.0.0.1 > nul
:loop
@echo Processing......
if not exist *.tmp goto :next
    @ping -n 5 127.0.0.1 > nul
goto loop
:next
@echo Done Processing!

Đã làm điều này trước đây, tôi có thể nói với bạn cách tiếp cận này không khó như vẻ ngoài của nó. Ngoài ra, rất dễ bảo trì - để mở rộng và thêm logic và dễ dàng đào tạo người khác để duy trì nó. Thông thường những điều này sẽ có cuộc sống của riêng họ ...
RobW

Tôi hài lòng với giải pháp này.
dùng1068446

6

Đủ đơn giản, miễn là các quy trình không cần đầu vào hoặc đầu ra tiêu chuẩn. Từ dòng lệnh hoặc trong một tệp bó:

process1 | process2 | process3 | process4

Điều này sẽ chạy tất cả bốn quy trình cùng một lúc và sẽ không quay trở lại cho đến khi tất cả chúng đã thoát. (Ngoại lệ có thể xảy ra: nếu một quy trình đóng rõ ràng đầu ra tiêu chuẩn, nó có thể được xử lý như thể nó đã thoát. Nhưng đó là điều bất thường, rất ít quy trình làm điều đó.)

Tôi không chắc chắn chính xác có bao nhiêu quá trình bạn có thể khởi chạy đồng thời theo cách này. Tôi đã thử tới mười.


Uhm, những gì tôi nhận được là tất cả các quy trình thực sự được bắt đầu cùng một lúc, nhưng process3 được giữ cho đến khi process4 hoàn thành, process2 được giữ cho đến khi process3 hoàn thành, v.v. Đây là từ dấu nhắc lệnh Windows cổ điển.
Sergio

@Sergio: Ý bạn là gì khi "cứ chờ đợi"?
Harry Johnston

1

Cách duy nhất để làm điều này là bắt đầu các tệp bó riêng biệt (xem start /?) chạy tác vụ riêng lẻ và viết tệp văn bản sau khi hoàn thành. Sau đó, bạn định kỳ kiểm tra xem các tệp văn bản đã được thực hiện.


0

Bạn có thể nhìn vào lệnh ghép ngắn Powershell Start-Job. Nó sẽ cho phép bạn làm điều này. More đây Powershell là vỏ của sự lựa chọn của Microsoft. Nó mạnh mẽ hơn nhiều so với các tập lệnh cmd và rất quan tâm đến việc đầu tư thời gian của bạn


Điều này không chờ đợi cho tất cả trong số họ chấm dứt?
Tamara Wijsman

Nó chắc chắn có thể tùy thuộc vào cách bạn viết nó. Bạn có thể thăm dò các công việc đã bắt đầu để xem liệu chúng đã hoàn thành và thoát khỏi tập lệnh của bạn sau khi chúng có. Mã trên trang đó xử lý toàn bộ danh sách các công việc, ba công việc tại một thời điểm và chờ đợi chúng thoát ra.
uSlackr

Uhm, chưa bao giờ làm bất cứ điều gì trước đây với Powershell. Tôi đã cố gắng thay đổi ví dụ để chạy các quy trình tùy ý và đợi chúng hoàn thành và sau khoảng 30 phút và 100 lần tra cứu trên M $ technet tôi đã từ bỏ. Tôi xin lỗi nếu tôi làm tổn thương cảm xúc của bất cứ ai nhưng Powershell là tào lao. Làm điều này dễ dàng hơn trong C (mà tôi nghĩ là đang nói ...) Dù sao cũng cảm ơn, tôi cá là ai đó vẫn sẽ thấy điều này hữu ích.
Sergio

Nếu có một điều Powershell không phải là tào lao và bạn sẽ không làm tổn thương cảm xúc của tôi nếu bạn không sử dụng nó. Tuy nhiên, bạn sẽ không học nó trong 30 phút tìm kiếm.
uSlackr

1
PowerShell không phải là tào lao, nó chỉ là một ngôn ngữ lập trình đầy đủ mà người ta phải học, thay vì một cú pháp giống như sh truyền thống. Tôi nhớ cảm giác giống hệt như cách nói về Perl, Python, Tcl, C # và mọi ngôn ngữ khác mà tôi đã cố gắng học "cho lulz" mà chưa sử dụng thực sự. (Tuy nhiên, khi tôi thực sự cần chúng, nó đã diễn ra khá dễ dàng.)
user1686

0

Hoặc bạn có thể sử dụng cái này: http://www.out-web.net/?p=167

Tôi đã làm điều đó, nó hoạt động, tuy nhiên đôi khi điều đó xảy ra là PID của quá trình hoàn thành ngay lập tức được sử dụng lại bởi một tiến trình Windows khác vừa mới bắt đầu và nó làm cho việc phát hiện kết thúc quá trình của bạn trở nên nguy hiểm / sai lầm.


2
Hãy tóm tắt những gì liên kết đó nói. Nếu trang bị sập, câu trả lời này sẽ không hữu ích.
Kevin Panko

Quá muộn là dường như.
Robert Massa

0

Tôi cũng đang tìm kiếm nhiệm vụ tương tự. Mục tiêu là chạy nhiều lệnh song song và trích xuất đầu ra (stdout & error) của tất cả các quy trình song song. Sau đó chờ cho tất cả các quá trình song song kết thúc và thực hiện một lệnh khác. Dưới đây là mã mẫu cho tệp BAT, có thể được thực thi trong CMD:

( start "" /B cmd /c ping localhost -n 6 ^>nul timeout /t 5 /nobreak start "" /B /D "C:\users\username\Desktop" cmd /c dir ^> dr.txt ^2^>^&^1 start "" /B cmd /c ping localhost -n 11 ^>nul timeout /t 10 /nobreak ) | pause Echo waited timeout /t 12 /nobreak

Tất cả các câu lệnh bên trong ()được thực thi trước, đợi chúng hoàn thành, sau đó hai dòng cuối cùng được thực thi. Tất cả các lệnh bắt đầu startđược thực hiện đồng thời.

Các liên kết này rất hữu ích: /programming//a/43762349/9689416https://ss64.com/nt/start.html

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.