คำตอบสั้น ๆ: ใช้ Task Scheduler บน Windows Server ตั้งเวลาให้สคริปต์ PowerShell หรือโปรแกรมทำงานอัตโนมัติ ทั้งผ่านหน้าจอและ Command Line พร้อมวิธีอ่านผลและแก้ปัญหา
คู่มือนี้อธิบาย Task Scheduler ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
Task Scheduler คือเครื่องมือตั้งเวลาในตัวของ Windows เทียบได้กับ Cron บน Linux ใช้สั่งให้สคริปต์หรือโปรแกรมทำงานเองตามเวลา เช่น ลบไฟล์ Log เก่าทุกคืน สำรองโฟลเดอร์ข้อมูล รีสตาร์ต Service ประจำสัปดาห์ หรือรันงานเมื่อเครื่องบูตเสร็จ บทความนี้ใช้ตัวอย่างจริงคือสคริปต์ PowerShell ที่ลบ Log ของ IIS ที่เก่ากว่า 30 วัน แล้วตั้งให้รันทุกวันเวลา 02:30 น. ทั้งผ่านหน้าจอและผ่าน Command Line
สิ่งที่ต้องเตรียม
- Windows Server 2019 หรือ 2022 และบัญชีในกลุ่ม Administrators
- สคริปต์หรือโปรแกรมที่ต้องการรัน และทดสอบรันด้วยมือสำเร็จแล้ว
- ตรวจว่าเวลาและ Time Zone ของเซิร์ฟเวอร์ถูกต้อง (ดูได้ที่ Settings, Time & Language หรือคำสั่ง
tzutil /g)
ขั้นตอนที่ 1: เตรียมสคริปต์ตัวอย่าง
สร้างโฟลเดอร์ C:\Scripts แล้วสร้างไฟล์ C:\Scripts\cleanup-iis-logs.ps1 ด้วย Notepad
# ลบไฟล์ Log ของ IIS ที่เก่ากว่า 30 วัน และบันทึกผลไว้ในไฟล์
$LogRoot = 'C:\inetpub\logs\LogFiles'
$Days = 30
$Report = 'C:\Scripts\logs\cleanup-iis-logs.log'
New-Item -ItemType Directory -Force -Path (Split-Path $Report) | Out-Null
$cutoff = (Get-Date).AddDays(-$Days)
$old = Get-ChildItem -Path $LogRoot -Recurse -File -Filter *.log |
Where-Object { $_.LastWriteTime -lt $cutoff }
$old | Remove-Item -WhatIf
"{0} found {1} file(s) older than {2} days" -f (Get-Date -Format s), $old.Count, $Days |
Add-Content -Path $Report
ในรอบแรกคำสั่ง Remove-Item มี -WhatIf ไว้ ทำให้สคริปต์แสดงเพียงว่าจะลบไฟล์ใด แต่ยังไม่ลบจริง ทดสอบรันด้วย PowerShell แบบ Administrator
powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Scripts\cleanup-iis-logs.ps1
ผลลัพธ์จะเป็นบรรทัด What if: Performing the operation "Remove File" on target ... สำหรับแต่ละไฟล์ ตรวจว่ารายการถูกต้อง แล้วจึงลบ -WhatIf ออก การลบไฟล์ด้วยสคริปต์ย้อนกลับไม่ได้ ถ้าไม่แน่ใจ ให้สำรองโฟลเดอร์ก่อน
ขั้นตอนที่ 2: สร้าง Task ด้วยหน้าจอ Task Scheduler
เปิด Task Scheduler จาก Server Manager เมนู Tools หรือพิมพ์ taskschd.msc ในหน้าต่าง Run แนะนำให้ใช้ Create Task... ในแผง Actions แทน Create Basic Task เพราะตั้งค่าได้ครบกว่า ควรสร้างโฟลเดอร์ของตัวเอง (คลิกขวาที่ Task Scheduler Library เลือก New Folder) เพื่อแยก Task ของคุณออกจาก Task ของระบบ
แท็บ General
- Name:
Cleanup IIS Logs - Security options: คลิก Change User or Group... พิมพ์
SYSTEMแล้วกด OK สำหรับงานดูแลเครื่องที่ไม่ต้องเข้าถึงไฟล์บนเครื่องอื่น หรือเลือกบัญชีผู้ใช้เฉพาะ แล้วเลือก Run whether user is logged on or not - เลือก Run with highest privileges
- Configure for: เลือก Windows Server 2019 หรือ Windows Server 2022 ตามเครื่อง (ชื่อในรายการอาจต่างกันตามรุ่น)
แท็บ Triggers
- กด New... ช่อง Begin the task เลือก On a schedule
- เลือก Daily ตั้งเวลาเริ่ม
2:30:00 AMและ Recur every1days - ตรวจว่าเลือก Enabled ไว้ที่ด้านล่าง แล้วกด OK
ตัวเลือก Begin the task อื่นที่ใช้บ่อย ได้แก่ At startup (รันเมื่อเครื่องบูต), At log on และ On an event (รันเมื่อเกิด Event ที่กำหนดใน Event Log)
แท็บ Actions
- กด New... Action เลือก Start a program
- Program/script:
powershell.exe - Add arguments:
-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\cleanup-iis-logs.ps1" - Start in:
C:\Scripts(ไม่ต้องใส่เครื่องหมายคำพูดในช่องนี้)
ห้ามใส่ path ของสคริปต์ในช่อง Program/script โดยตรง เพราะไฟล์ .ps1 ไม่ได้ถูกตั้งให้รันด้วย PowerShell โดยค่าเริ่มต้น ถ้าเป็นไฟล์ .bat หรือ .cmd ใส่ path ของไฟล์ในช่อง Program/script ได้เลย
แท็บ Conditions และ Settings
- Conditions: เอาเครื่องหมายออกจาก Start the task only if the computer is on AC power ซึ่งไม่เกี่ยวกับเซิร์ฟเวอร์และบางครั้งทำให้ Task ไม่ทำงาน
- Settings: เลือก Run task as soon as possible after a scheduled start is missed เพื่อให้รันตามหลังถ้าเครื่องปิดอยู่ในเวลาที่กำหนด
- Settings: Stop the task if it runs longer than ตั้งเป็นเวลาที่เหมาะกับงาน เช่น 1 hour เพื่อไม่ให้สคริปต์ที่ค้างรันอยู่ตลอดไป
- Settings: If the task is already running เลือก Do not start a new instance
กด OK ถ้าเลือกบัญชีผู้ใช้ที่ไม่ใช่ SYSTEM ระบบจะถามรหัสผ่านของบัญชีนั้นเพื่อเก็บไว้ใช้รัน
ขั้นตอนที่ 3: หรือสร้าง Task ด้วย Command Line
วิธีนี้เหมาะกับการตั้งหลายเครื่องให้เหมือนกัน ใช้ PowerShell แบบ Administrator
$action = New-ScheduledTaskAction -Execute 'powershell.exe' `
-Argument '-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\cleanup-iis-logs.ps1"' `
-WorkingDirectory 'C:\Scripts'
$trigger = New-ScheduledTaskTrigger -Daily -At 2:30am
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -ExecutionTimeLimit (New-TimeSpan -Hours 1) `
-MultipleInstances IgnoreNew
Register-ScheduledTask -TaskName 'Cleanup IIS Logs' -Action $action -Trigger $trigger `
-Settings $settings -User 'SYSTEM' -RunLevel Highest
หรือใช้คำสั่ง schtasks ที่มีใน Windows ทุกรุ่นจาก Command Prompt
schtasks /Create /TN "Cleanup IIS Logs" /TR "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Scripts\cleanup-iis-logs.ps1" /SC DAILY /ST 02:30 /RU SYSTEM /RL HIGHEST
ผลลัพธ์ที่ถูกต้องคือข้อความ SUCCESS: The scheduled task "Cleanup IIS Logs" has successfully been created.