ตั้งเวลา ปิด – เปิด โปรแกรมด้วย batch file แบบหน่วงเวลาเปิด

#ความขี้เกียจก่อเกิดนวัตกรรม ใส่ hashtag รอเลย ซึ่งที่มาของโจทย์นี้ง่ายๆ คือ มันจะมีโปรแกรมบางตัวต้องปิด ก่อนถึง dead line หมายความว่า ถ้าถึงช่วงเวลานี้แล้ว โปรแกรมไอ้ที่ว่านี่มันจะทำงานไม่ได้ เพราะว่า server จะตัด task ทุกอย่างทิ้ง ไม่ให้มันทำอะไรจนกว่าจะ backup เสร็จ ดังนั้น ก็เลยต้องปิดมันก่อนจะถึงเวลา ซึ่งในที่นี้ก็มีการหน่วงเวลาเปิดไว้ด้วย ซึ่ง process การทำงานก็จะมีแค่ ปิด – รอ – เปิด แค่นี้ มาดู code ง่ายๆ กันดีกว่า ซึ่งก็ใช้ท่าเดิม คือ batch file แบบบ้านๆ  run ใน task schedule โดยตั้งเวลาเอาไว้แค่นั้น!  

Command ที่ใช้

taskkill จบการทำงานหรือปิด process ได้จากชื่อ หรือ PID ก็ได้ ref: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/taskkill

start เอาไว้ run โปรแกรมขึ้นมา ref: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/start

จบ มาเริ่ม code เลย

@echo off
echo Sleep  : %time%
rem ปิดโปรแกรมแบบ force หรือหักคอปิด จะทำอะไรอยู่ไม่ต้องสนใจ /im คือหาชื่อตามนี้ 
taskkill /f /im ProgramA.exe >nul 2>nul && (
    echo ProgramA.exe was killed
) || (
    echo no process was killed
)
taskkill /f /im ProgramB.exe >nul 2>nul && (
    echo ProgramB.exe was killed
) || (
    echo no process was killed
)
rem เอาไว้รับ argument ว่าจะให้ timeout กี่วิก็ใส่เลขมา ถ้าไม่มีก็ทดสอบที่ 10 วิ 
if [%~1] == [] (
    timeout %~1 > NUL
) else (
    timeout 10 > NUL
)
rem ตื่นๆ ทดสอบเวลาที่ส่ง arument ว่ามามั้ย ใช้ได้มั้ย
echo Wakeup : %time%
rem ไป path ของโปรแกรม
cd "C:\programDIR\"
rem ที่นี้ก็ run มันขึ้นมา หรือจะใช้แบบ path\program เลยก็ได้ ไม่ต้องใช้ cd
start ProgramA.exe
start ProgramB.exe

สรุป

ทดสอบแล้ว ใช้งานได้ แต่ติดปัญหาอย่างเดียว ถ้า Program มันเปิดขึ้นมาแล้วไม่ได้ทำงานได้เลย ต้องมีการ login เข้าไป ไอ้การตั้งเปิด/ปิดแบบนี้ ก็ไม่ได้ช่วยอะไรมาก เพราะยังไงก็ต้องใช้คนทำแทนอยู่ดี เว้นแต่จะ authen ได้เลย