ฉันจะตั้งค่า จำกัด เวลาบนแบตช์ไฟล์ได้อย่างไร


2

ฉันมีไฟล์แบตช์ที่เรียกโปรแกรมภายนอกที่ค้างเป็นระยะ สิ่งที่ฉันต้องการจะทำคือการกำหนดเวลาในแบทช์ไฟล์ / CMD พรอมต์ซึ่งมันจะปิดโดยอัตโนมัติหลังจากระยะเวลาหนึ่ง สิ่งหนึ่งที่จับได้คือโปรแกรมภายนอกที่แฮงค์อาจมีอินสแตนซ์หนึ่งตัวหรือมากกว่านั้นทำงานในเวลาที่กำหนดและฉันต้องการให้แบตช์ไฟล์กดปุ่ม จำกัด เวลาเพื่อปิดอินสแตนซ์ของโปรแกรมที่ถูกทริกเกอร์โดยแบทช์ ฉันจะทำสิ่งนี้ได้อย่างไร ทางออกที่ดีจะทำงานบน Windows XP, Vista และ 7

คำตอบ:


1
REM start the program as quickly as possible to avoid other processes starting
tasklist > file1.txt & start notepad.exe & tasklist > file2.txt
REM Find the PID of the program we just started
for /f "tokens=2" %%a in ('fc file1.txt file2.txt^|find "notepad.exe"') do set PID=%%a
REM delay for 5 seconds
FOR /l %%a in (5,-1,1) do (Echo closing in %%as&ping -n 2 -w 1 127.0.0.1>NUL)
REM delete the program using it's PID
tskill %PID%

ping -n 2 -w 1 127.0.0.1จะหยุดเกือบ 1 วินาที (ระยะเวลาระหว่างวันที่ 2 ส่ง Ping)
นี้จะทำงานบน XP เป็นchoiceไม่รวมอยู่ใน XP


-1

เขียนชุดนี้:

@echo off    
choice /t <waiting time in seconds> /d y
taskkill /im <process name> /f /fi "status eq not responding"

ใส่สิ่งนี้ไว้ในลูปถ้าจำเป็น


สิ่งนี้จะไม่แยกแยะสำหรับอินสแตนซ์ที่เริ่มต้นโดยแบตช์ไฟล์ และสถานะที่ไม่ตอบสนองอาจทำงานได้กับโปรแกรม GUI เท่านั้น
Joey

touchéเกี่ยวกับอินสแตนซ์ .. สถานะจะใช้งานได้ทุกอย่างมันเป็นสถานะที่คุณเห็นในตัวจัดการงาน .... ถ้าสถานะนั้น "กำลังทำงาน" และยังคงโปรแกรมหยุดทำงานฉันสงสัยว่ามีวิธีใดที่จะตรวจจับการแฮงค์ ..
tumchaaditya

ตัวจัดการหน้าต่างที่ไม่ตอบสนองจะถูกตรวจพบโดยโปรแกรมจัดการหน้าต่างเมื่อโปรแกรมไม่สามารถประมวลผลเหตุการณ์ในคิวข้อความ แต่นั่นต้องใช้หน้าต่างและฉันไม่เคยเห็นโปรแกรมคอนโซล "หยุด" ในแบบนั้น สันนิษฐานว่าเป็นเพราะกระบวนการโฮสต์คอนโซลไม่เคยหยุดทำงานและโปรแกรมที่ทำงานอยู่ภายในไม่เคยพูดคุยกับ WM โดยตรง
Joey

ในกรณีนี้กระบวนการยังคง "กำลังทำงาน" ต่อตัวจัดการงาน แต่มันได้รับความเดือดร้อนจากการหมดเวลาของเครือข่ายและมันก็แค่นั่งรอผู้ใช้เพื่อดูและจัดการกับมัน ในกรณีนี้เนื่องจากฉันไม่ต้องการให้ผู้ใช้เห็น / จัดการกับสิ่งนั้นฉันก็โอเคที่จะฆ่ากระบวนการทุก ๆ สองสามชั่วโมง (กู้คืนได้อย่างสวยงามพอ) ตามที่ Joey ชี้ให้เห็นมันจะฆ่ากระบวนการทั้งหมดที่มีชื่อเดียวกันมากกว่าที่ฉันเพิ่งเริ่มต้น ฉันเห็นว่า taskkill มีตัวเลือกให้ฆ่าโดย PID แต่ฉันไม่รู้วิธีรับ PID ของอินสแตนซ์เมื่อเปิดใช้
russellpierce
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.