รันกระบวนการพื้นหลังพร้อมกันหลายกระบวนการจากนั้นรอให้กระบวนการทั้งหมดหยุดทำงานบน Windows


14

ไม่มีใครรู้ว่ามีสคริปต์ cmd ที่ทำเช่นนั้นและ / หรือเครื่องมือบรรทัดคำสั่งพร้อมสำหรับงานหรือไม่


การทำเช่นนั้นอาจเป็นอันตรายต่อข้อมูลของคุณ!
Santosh Kumar

8
@Santosh: คุณหมายถึงอะไร "สามารถเป็นอันตรายต่อข้อมูลของคุณ"? ในกรณีเฉพาะของฉันงานพื้นหลังจะประมวลผลชุดข้อมูลอิสระของตัวเอง ไม่มีความเสี่ยงในการแก้ไขพร้อมกัน
Sergio

1
จาก Win32 API API ฉันคิดว่า WaitForMultipleObjectsกับ bWaitAll = TRUE จะทำงาน การเขียนโปรแกรมจะไม่ยากเลยที่จะแยกโปรแกรมออกจากไฟล์อินพุตบางไฟล์ถ้าไม่มีคำตอบที่น่าพอใจ
user1686

1
@grawity: ใช่ฉันวางแผนที่จะทำเพียงแค่ว่าถ้าไม่มีอะไรเกิดขึ้น (และโพสต์รหัสที่นี่) แต่ขอดูว่าฉันสามารถหลีกเลี่ยง reinventing ล้อ :)
เซร์คิโอ

การปรับตั้งล้อใหม่เป็นสิ่งที่ดีถ้าล้อที่มีอยู่ในปัจจุบันเป็นสี่เหลี่ยมจัตุรัส ...
user1686

คำตอบ:


10

สร้างไฟล์แบตช์สามไฟล์ด้านล่าง Main.bat เปิดตัว 1.bat และ 2.bat

1.bat และ 2.bat เขียนไฟล์ชั่วคราวที่ main.bat ตรวจสอบ ขณะที่ 1.bat และ 2.bat ทำงานอยู่ main.bat รายงานกลับมาว่าการประมวลผลยังคงเกิดขึ้น เมื่อคุณกด Enter บนหน้าต่างที่เปิด 1.bat หรือ 2.bat ไฟล์ชั่วคราวจะถูกลบและโปรแกรมจะออก นี่เป็นการจำลองการประมวลผลการหยุดสำหรับไฟล์. bat นั้น หากคุณทำเช่นนี้ทั้ง 1 และ 2.bat, main.bat จะรายงานให้คุณทราบว่าการประมวลผลเสร็จสิ้นสำหรับกระบวนการเหล่านี้ คุณสามารถสร้าง 1.bat และ 2.bat ทำสิ่งที่คุณต้องการตราบใดที่คุณล้างไฟล์ชั่วคราวเมื่อคุณทำเสร็จ ณ จุดนี้ main.bat สามารถทำสิ่งที่คุณต้องการให้ทำเช่นกัน

1.bat

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

2.bat

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

main.bat

@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!

ก่อนหน้านี้ฉันสามารถบอกได้ว่าวิธีการนี้ไม่ยากอย่างที่คิด นอกจากนี้ยังบำรุงรักษาง่าย - เพื่อขยายและเพิ่มตรรกะและง่ายต่อการฝึกอบรมผู้อื่นเพื่อรักษาไว้ โดยปกติสิ่งเหล่านี้ใช้ชีวิตของพวกเขาเอง ...
RobW

ฉันมีความสุขกับการแก้ปัญหานี้
user1068446

คุณสามารถขยายคำสั่ง @ping ได้หรือไม่? ฉันไม่เข้าใจว่าทำไมคุณเลือกที่จะทำสิ่งนี้และสิ่งที่ 127.0.0.1 คือ
Joe

6

ง่ายพอหากกระบวนการไม่ต้องการอินพุตหรือเอาต์พุตมาตรฐาน จากบรรทัดคำสั่งหรือในไฟล์แบตช์:

process1 | process2 | process3 | process4

สิ่งนี้จะเรียกใช้กระบวนการทั้งสี่พร้อมกันและจะไม่กลับจนกว่าพวกเขาจะออกทั้งหมด (ข้อยกเว้นที่เป็นไปได้: หากกระบวนการปิดเอาต์พุตมาตรฐานอย่างชัดเจนกระบวนการนั้นอาจถูกจัดการเหมือนกับว่าออกไปแล้ว แต่นั่นผิดปกติกระบวนการน้อยมากที่ทำเช่นนั้น)

ฉันไม่แน่ใจว่าคุณสามารถเปิดใช้งานกระบวนการพร้อมกันได้อย่างแน่นอน ฉันเคยลองมาแล้วสิบครั้ง


อืมสิ่งที่ฉันได้รับคือกระบวนการทั้งหมดเริ่มต้นพร้อมกัน แต่กระบวนการ 3 รอต่อไปจนกว่ากระบวนการ 4 จะเสร็จสมบูรณ์กระบวนการ 2 จะรอจนกว่ากระบวนการ 3 จะเสร็จสิ้นและต่อไปเรื่อย ๆ นี่คือจากพรอมต์คำสั่ง Windows คลาสสิกโดยวิธี
Sergio

@Sergio: คุณหมายถึงอะไรโดย "คอยคอย"
Harry Johnston

1

วิธีเดียวในการทำเช่นนี้คือเริ่มแยกไฟล์แบตช์ (ดูstart /?) ที่รันงานแต่ละงานและเขียนไฟล์ข้อความเมื่อเสร็จสิ้น จากนั้นคุณตรวจสอบว่ามีการสร้างไฟล์ข้อความเป็นระยะ ๆ หรือไม่


0

คุณอาจดู cmdlet Powershell Start-Job ควรอนุญาตให้คุณทำเช่นนี้ เพิ่มเติมที่นี่ Powershell เป็นตัวเลือกที่ดีที่สุดของ Microsoft มันมีประสิทธิภาพมากกว่า cmd script และไม่ต้องกังวลเรื่องการลงทุนในเวลาของคุณ


สิ่งนี้ไม่รอให้พวกเขาทั้งหมดยุติ?
Tamara Wijsman

มันขึ้นอยู่กับว่าคุณเขียนมันอย่างไร คุณสามารถสำรวจความคิดเห็นของงานที่เริ่มต้นเพื่อดูว่าพวกเขาได้เสร็จสิ้นและออกจากสคริปต์ของคุณเมื่อพวกเขามี โค้ดในหน้านั้นประมวลผลรายการงานทั้งหมดทีละสามรายการและรอให้พวกเขาออก
uSlackr

อืมไม่เคยทำอะไรมาก่อนด้วย Powershell ฉันพยายามเปลี่ยนตัวอย่างเพื่อเรียกใช้กระบวนการโดยพลการและรอให้เสร็จสมบูรณ์และหลังจากนั้นประมาณ 30 นาทีและ 100 การค้นหาบน M $ technet ที่ฉันยอมแพ้ ฉันขอโทษถ้าฉันทำร้ายความรู้สึกของใครก็ได้ แต่ Powershell นั้นไร้สาระ มันง่ายกว่าที่จะทำใน C (ซึ่งฉันคิดว่ากำลังบอก ... ) ขอบคุณต่อไปฉันพนันได้เลยว่าใครบางคนจะพบว่ามีประโยชน์
Sergio

หากมีสิ่งหนึ่งที่ Powershell ไม่ได้เป็นเรื่องไร้สาระและคุณจะไม่ทำร้ายความรู้สึกของฉันถ้าคุณไม่ใช้มัน อย่างไรก็ตามคุณจะไม่เรียนรู้ใน 30 นาทีของการค้นหา
uSlackr

1
PowerShell ไม่ได้เป็นเรื่องไร้สาระมันเป็นเพียงภาษาการเขียนโปรแกรมเต็มรูปแบบที่ต้องเรียนรู้แทนที่จะเป็นไวยากรณ์แบบดั่งเดิม ฉันจำได้ว่ารู้สึกเหมือนกันกับ Perl, Python, Tcl, C # และทุกภาษาอื่น ๆ ที่ฉันพยายามเรียนรู้ "สำหรับ lulz" โดยที่ยังไม่ได้ใช้จริง (เมื่อฉันต้องการพวกเขาจริง ๆ แล้วมันง่ายพอสมควร)
user1686

0

หรือคุณสามารถใช้สิ่งนี้: http://www.out-web.net/?p=167

ฉันทำแล้วมันใช้งานได้ แต่บางครั้งมันเกิดขึ้นว่า PID ของกระบวนการที่เสร็จสิ้นนั้นถูกนำกลับมาใช้อีกครั้งโดยโพรเซสอื่นของ Windows ที่เพิ่งเริ่มทำงาน


2
โปรดสรุปสิ่งที่ลิงก์บอกว่า หากหน้าเว็บหยุดทำงานคำตอบนี้จะไม่เป็นประโยชน์
Kevin Panko

สายเกินไปดูเหมือนว่า
Robert Massa

0

ฉันกำลังมองหางานที่คล้ายกัน วัตถุประสงค์คือการรันหลายคำสั่งแบบขนานและแยกเอาต์พุต (stdout & error) ของกระบวนการแบบขนานทั้งหมด จากนั้นรอให้กระบวนการแบบขนานทั้งหมดเสร็จสิ้นและดำเนินการคำสั่งอื่น ต่อไปนี้เป็นตัวอย่างรหัสสำหรับไฟล์ BAT สามารถดำเนินการใน 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

คำสั่งทั้งหมดที่อยู่ภายใน()จะถูกดำเนินการก่อนรอให้เสร็จสมบูรณ์จากนั้นสองบรรทัดสุดท้ายจะถูกดำเนินการ คำสั่งทั้งหมดที่เริ่มต้นด้วยstartจะถูกดำเนินการพร้อมกัน

ลิงก์เหล่านี้มีประโยชน์: /programming//a/43762349/9689416และhttps://ss64.com/nt/start.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.