Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Windows Server

วิธีสร้างและจัดการ Scheduled Tasks ด้วย PowerShell

ผู้ใช้และผู้ดูแลส่วนใหญ่ใช้คอนโซล 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"

โปรดสังเกตตัวอย่างนี้ใช้ข้อมูลประจำตัวของบัญชีที่ใช้รันงาน หากไม่ระบุข้อมูลประจำตัว เนื่องจากไม่ได้เก็บไว้ในงาน จะมีการขอข้อมูลประจำตัวเมื่อนำเข้า