ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

Home ตั้งเวลาให้งานทำงานอัตโนมัติด้วย Task Scheduler บน Windows Server

ตั้งเวลาให้งานทำงานอัตโนมัติด้วย Task Scheduler บน Windows Server

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 every 1 days
  • ตรวจว่าเลือก 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.

ตรวจสอบผลลัพธ์

  1. ใน Task Scheduler คลิกขวาที่ Task เลือก Run เพื่อทดสอบทันที
  2. กด F5 เพื่อรีเฟรช คอลัมน์ Last Run Result ควรเป็น The operation completed successfully. (0x0)
  3. เปิดไฟล์ C:\Scripts\logs\cleanup-iis-logs.log ต้องมีบรรทัดใหม่พร้อมเวลาที่รัน
  4. ถ้าแท็บ History แสดงว่าปิดอยู่ ให้คลิก Enable All Tasks History ในแผง Actions เพื่อเก็บประวัติการทำงาน

ตรวจด้วย PowerShell ได้เช่นกัน

Get-ScheduledTaskInfo -TaskName 'Cleanup IIS Logs'

ความหมายของรหัสผลลัพธ์ที่พบบ่อย

รหัสความหมาย
0x0สำเร็จ
0x1โปรแกรมหรือสคริปต์จบด้วยข้อผิดพลาด (Exit code 1) มักเป็นปัญหาในสคริปต์เอง หรือ path ผิด
0x2หาไฟล์ที่ระบุไม่พบ
0x41301Task กำลังทำงานอยู่
0x41303Task ยังไม่เคยรัน
0x8007052Eชื่อผู้ใช้หรือรหัสผ่านที่เก็บไว้ใน Task ไม่ถูกต้อง

ปัญหาที่พบบ่อย

รันด้วยมือได้ แต่ตามเวลาไม่ทำงาน หรือได้ 0x1

สาเหตุที่พบบ่อยคือสคริปต์อ้างถึง path แบบสัมพัทธ์ ซึ่งเมื่อรันจาก Task Scheduler โฟลเดอร์ทำงานจะเป็น C:\Windows\System32 ให้ใส่ช่อง Start in หรือใช้ path เต็มในสคริปต์ อีกสาเหตุคือสคริปต์อ้างถึง Drive ที่ Map ไว้ เช่น Z:\ ซึ่งมีเฉพาะใน Session ของผู้ใช้ที่ล็อกอิน ให้ใช้ UNC path เช่น \\fileserver\backup แทน (ดู วิธีการ Map Drive บน Windows Server 2022) และบัญชี SYSTEM เข้าถึงไฟล์บนเครื่องอื่นในเครือข่ายไม่ได้ ถ้าต้องใช้ ให้รัน Task ด้วยบัญชีผู้ใช้ที่มีสิทธิ์บนปลายทาง

Task หยุดทำงานหลังเปลี่ยนรหัสผ่าน

Task ที่ใช้ Run whether user is logged on or not จะเก็บรหัสผ่านไว้ เมื่อเปลี่ยนรหัสผ่านบัญชี Task จะล้มเหลวด้วยรหัส 0x8007052E และอาจทำให้บัญชีถูกล็อกถ้าเปิด Account Lockout Policy ไว้ แก้โดยเปิด Properties ของ Task กด OK แล้วใส่รหัสผ่านใหม่

ต้องการดูรายละเอียดข้อผิดพลาดเพิ่มเติม

เปิด Event Viewer ที่ Applications and Services Logs, Microsoft, Windows, TaskScheduler, Operational จะเห็นทุกขั้นตอนของการเริ่มและจบ Task สำหรับสคริปต์ PowerShell การเพิ่ม Start-Transcript -Path C:\Scripts\logs\transcript.log -Append ไว้บรรทัดแรก และ Stop-Transcript ไว้บรรทัดสุดท้าย จะบันทึกทุกข้อความที่สคริปต์แสดง ช่วยหาสาเหตุได้ง่ายขึ้นมาก

งานที่มักตั้งเวลาควบคู่กันบน Windows Server คือการสำรองข้อมูล ดู สำรองข้อมูลด้วย Windows Server Backup หากติดปัญหาในการตั้งค่า ติดต่อทีมงาน THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security