ผู้ใช้และผู้ดูแลส่วนใหญ่ใช้คอนโซล GUI taskschd.msc เพื่อสร้างและจัดการงานที่กำหนดเวลา (Scheduled Tasks) บน Windows อย่างไรก็ตาม ในสคริปต์และขั้นตอนการทำงานอัตโนมัติต่างๆ การใช้คุณสมบัติ PowerShell ในการสร้าง Scheduled Tasks จะสะดวกกว่ามาก ในบทความนี้เราจะแสดงวิธีสร้างและจัดการงานของ Windows Scheduler โดยใช้ PowerShell
การจัดการ Scheduled Tasks บน Windows ผ่าน PowerShell
โมดูล PowerShell ScheduledTasks ใช้สำหรับจัดการ Scheduled Tasks บน Windows 10/Windows Server 2016 สามารถแสดงรายการ cmdlets ในโมดูลได้ดังนี้:
Get-Command -Module ScheduledTasks
- Disable-ScheduledTask
- Enable-ScheduledTask
- Export-ScheduledTask
- Get-ClusteredScheduledTask
- Get-ScheduledTask
- Get-ScheduledTaskInfo
- New-ScheduledTask
- New-ScheduledTaskAction
- New-ScheduledTaskPrincipal
- New-ScheduledTaskSettingsSet
- New-ScheduledTaskTrigger
- Register-ClusteredScheduledTask
- Register-ScheduledTask
- Set-ClusteredScheduledTask
- Set-ScheduledTask
- Start-ScheduledTask
- Stop-ScheduledTask
- Unregister-ClusteredScheduledTask
- Unregister-ScheduledTask
schtasks.exe ถูกใช้ใน Windows เพื่อสร้างและจัดการงาน Schedulerสร้าง Scheduled Task ด้วย Windows PowerShell
ใน PowerShell เวอร์ชันใหม่ (ตั้งแต่ PowerShell 3.0 บน Windows Server 2012/Windows 8) สามารถใช้ cmdlet New-ScheduledTaskTrigger และ Register-ScheduledTask เพื่อสร้าง Scheduled Tasks
สมมติว่าเราต้องการสร้าง Scheduled Task ที่ควรทำงานระหว่างเริ่มต้นระบบ (หรือเวลาเฉพาะ) และรันสคริปต์หรือคำสั่ง PowerShell บางอย่าง มาสร้าง Scheduled Task ชื่อ StartupScript1 งานนี้ควรรันไฟล์สคริปต์ PowerShell C:\PS\StartupScript.ps1 เวลา 10:00 น. ทุกวัน งานจะถูกรันด้วยสิทธิ์สูงสุด (checkbox "Run with highest privileges") ภายใต้บัญชี SYSTEM
$Trigger= New-ScheduledTaskTrigger -At 10:00am -Daily
$User= "NT AUTHORITY\SYSTEM"
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "C:\PS\StartupScript1.ps1"
Register-ScheduledTask -TaskName "StartupScript1" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest –Force
หากสร้างงานสำเร็จ จะปรากฏสถานะ "Ready"
หากมี PowerShell Execution Policy ที่เปิดใช้งานบนคอมพิวเตอร์ซึ่งป้องกันไม่ให้สคริปต์ PS1 รันได้ สามารถรันสคริปต์ PowerShell จาก Scheduled Task ด้วยพารามิเตอร์ –Bypass
ใช้โค้ดนี้เมื่อสร้างงานใหม่:
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "–NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File C:\PS\StartupScript.ps1"
$Trigger= New-ScheduledTaskTrigger -AtStartupหากต้องการรันงานเมื่อผู้ใช้ล็อกออน:
$Trigger= New-ScheduledTaskTrigger -AtLogonเปิดคอนโซล taskschd.msc และตรวจสอบว่ามีงาน Scheduler ใหม่ใน Task Scheduler Library
ใน PowerShell 2.0 (Windows 7, Windows Server 2008 R2) เพื่อสร้าง Scheduled Task จาก PowerShell สามารถใช้ COM interface Schedule.Service (หรืออัปเกรดเวอร์ชัน PowerShell) ในตัวอย่างนี้ เราสร้าง Scheduled Task ที่จะรันไฟล์เฉพาะที่มีสคริปต์ PowerShell ระหว่างการเริ่มต้น งานจะทำงานด้วยสิทธิ์ NT AUTHORITY\SYSTEM
วิธีดูและรัน Scheduled Tasks ด้วย PowerShell
สามารถแสดงรายการ Scheduled Tasks ที่ใช้งานอยู่ทั้งหมดบน Windows ด้วยคำสั่ง:
Get-ScheduledTask -TaskPath | ? state -ne Disabled
เพื่อดูข้อมูลเกี่ยวกับงานเฉพาะ:
Get-ScheduledTask CheckServiceState | Get-ScheduledTaskInfo
LastRunTime : 4/7/2021 10:00:00 AM LastTaskResult : 267011 NextRunTime : 4/8/2021 10:00:00 AM NumberOfMissedRuns : 0 TaskName : CheckServiceState TaskPath : \ PSComputerName :
สามารถปิดใช้งานงานนี้ได้:
Get-ScheduledTask CheckServiceState | Disable-ScheduledTask
เพื่อเปิดใช้งานงาน:
Get-ScheduledTask CheckServiceState | Enable-ScheduledTask
เพื่อรันทันที (โดยไม่รอตารางเวลา) ให้รัน:
Start-ScheduledTask CheckServiceState
เพื่อลบงานออกจาก Task Scheduler Library ให้สมบูรณ์:
Unregister-ScheduledTask -TaskName CheckServiceState
หากต้องการเปลี่ยนชื่อผู้ใช้ที่ใช้รันงาน และตัวอย่างเช่น โหมดความเข้ากันได้ ให้ใช้ cmdlet Set-ScheduledTask:
$task_user = New-ScheduledTaskPrincipal -UserId woshub\j.abrams' -RunLevel Highest
$task_settings = New-ScheduledTaskSettingsSet -Compatibility 'Win8'
Set-ScheduledTask -TaskName CheckServiceState_PS -Principal $task_user -Settings $task_settings
หากได้ข้อผิดพลาด "Set-ScheduledTask: No mapping between account names and security IDs was done" ตรวจสอบว่าระบุชื่อผู้ใช้ถูกต้อง
วิธี Export และ Import Scheduled Tasks ผ่านไฟล์ XML
PowerShell อนุญาตให้ส่งออกการตั้งค่าปัจจุบันของ Scheduled Task ใดๆ ไปเป็นไฟล์ข้อความ XML ดังนั้นจึงสามารถส่งออกพารามิเตอร์ของงานใดงานหนึ่งและปรับใช้งานไปยังคอมพิวเตอร์อื่นได้ งานสามารถส่งออกได้ทั้งจาก Task Scheduler GUI และจากคอนโซล PowerShell
คำสั่งส่งออกงานชื่อ StartupScript ไปยังไฟล์ StartupScript.xml:
Export-ScheduledTask StartupScript | out-file c:\tmp\StartupScript.xml
Cmdlet Export-ScheduledTask ไม่พร้อมใช้งานใน PowerShell 2.0 ดังนั้นใน Windows 7 / Windows Server 2008 R2 ควรใช้เครื่องมือในตัว schtasks เพื่อส่งออกการตั้งค่างานและส่งออกผลลัพธ์ไปยังไฟล์ข้อความ:
schtasks /query /tn "NewPsTask" /xml >> "c:\tmp\NewPsTask.xml"
หลังจากส่งออกการตั้งค่า Scheduled Task ไปยังไฟล์ XML แล้ว สามารถนำเข้าไปยังคอมพิวเตอร์เครือข่ายใดๆ ได้ โดยใช้ GUI, SchTasks.exe หรือ PowerShell
Cmdlet Register-ScheduledTask ช่วยให้นำเข้าการตั้งค่างานจากไฟล์ XML และลงทะเบียน:
Register-ScheduledTask -Xml (Get-Content "\\mun-fs01\public\NewPsTask.xml" | out-string) -TaskName "NewPsTask"
ใน PowerShell 2.0 (Windows 7/Server 2008 R2) การนำเข้างานด้วยเครื่องมือ schtasks จะง่ายกว่า คำสั่งแรกสร้างงานใหม่ คำสั่งที่สองจะรันทันที (โดยไม่รอให้ Trigger ทำงาน)
schtasks /create /tn "NewPsTask" /xml "\\Srv1\public\NewPsTask.xml" /ru corp\skrutapal /rp Pa$$w0rd
schtasks /Run /TN "NewPsTask"
โปรดสังเกตตัวอย่างนี้ใช้ข้อมูลประจำตัวของบัญชีที่ใช้รันงาน หากไม่ระบุข้อมูลประจำตัว เนื่องจากไม่ได้เก็บไว้ในงาน จะมีการขอข้อมูลประจำตัวเมื่อนำเข้า