Computer >> คอมพิวเตอร์ >  >> ระบบ >> Windows Server

วิธีสร้างและจัดการงานที่กำหนดเวลาไว้ด้วย PowerShell

ผู้ใช้และผู้ดูแลระบบส่วนใหญ่ใช้ taskschd.msc คอนโซลอินเทอร์เฟซแบบกราฟิกเพื่อสร้างและจัดการงานที่กำหนดเวลาไว้บน Windows อย่างไรก็ตาม ในสคริปต์ต่างๆ และโฟลว์อัตโนมัติ จะสะดวกกว่ามากที่จะใช้ฟีเจอร์ PowerShell เพื่อสร้างงานที่กำหนดเวลาไว้ ในบทความนี้ เราจะแสดงวิธีสร้างและจัดการงาน Windows Scheduler โดยใช้ PowerShell

การจัดการงานที่กำหนดเวลาไว้บน Windows ผ่าน PowerShell

ScheduledTasks โมดูล PowerShell ใช้เพื่อจัดการงานที่กำหนดเวลาไว้บน Windows 10/Windows Server 2016 คุณสามารถแสดงรายการ cmdlets ในโมดูลได้ดังนี้:

Get-Command -Module ScheduledTasks

  • Disable-ScheduledTask
  • Enable-ScheduledTask
  • ส่งออก-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
  • เริ่ม-ScheduledTask
  • หยุด-ScheduledTask
  • Unregister-ClusteredScheduledTask
  • Unregister-ScheduledTask

วิธีสร้างและจัดการงานที่กำหนดเวลาไว้ด้วย PowerShell

คำแนะนำ . ก่อนหน้านี้ เครื่องมือคอนโซลในตัว schtasks.exe ถูกใช้ใน Windows เพื่อสร้างและจัดการงานตัวกำหนดตารางเวลา

การสร้างงานที่กำหนดเวลาไว้ด้วย Windows PowerShell

ใน PowerShell เวอร์ชันใหม่ (เริ่มต้นด้วย PowerShell 3.0 บน Windows Server 2012/Windows 8) คุณสามารถใช้ New-ScheduledTaskTrigger และ Register-ScheduledTask cmdlets เพื่อสร้างงานที่กำหนดเวลาไว้

สมมติว่า เราจำเป็นต้องสร้างงานที่กำหนดเวลาไว้ซึ่งควรทำงานในระหว่างการเริ่มต้น (หรือในเวลาที่กำหนด) และดำเนินการสคริปต์หรือคำสั่ง PowerShell บางรายการ มาสร้างงานที่กำหนดเวลาไว้ชื่อ StartupScript1 งานนี้ควรเรียกใช้ไฟล์สคริปต์ PowerShell C:\PS\StartupScript.ps1 เวลา 10.00 น. ทุกวัน งานจะดำเนินการด้วยสิทธิ์ระดับสูง (ช่องทำเครื่องหมาย “เรียกใช้ด้วยสิทธิ์สูงสุด”) ภายใต้บัญชีระบบ

$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

หากสร้างงานสำเร็จ สถานะ “พร้อม” จะปรากฏขึ้น

วิธีสร้างและจัดการงานที่กำหนดเวลาไว้ด้วย PowerShell

สคริปต์ PowerShell ของคุณจะทำงานตามกำหนดเวลาที่ระบุ หากคุณมี PowerShell Execution Policy ที่เปิดใช้งานบนคอมพิวเตอร์ของคุณซึ่งป้องกันไม่ให้สคริปต์ PS1 ทำงาน คุณสามารถเรียกใช้สคริปต์ PowerShell จากงานที่กำหนดเวลาไว้ด้วย –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 คอนโซล และตรวจสอบให้แน่ใจว่าคุณมีงานตัวกำหนดตารางเวลาใหม่ในไลบรารีตัวกำหนดเวลางาน

วิธีสร้างและจัดการงานที่กำหนดเวลาไว้ด้วย PowerShell

ใน Powershell 2.0 (Windows 7, Windows Server 2008 R2) ในการสร้างงานที่กำหนดเวลาไว้จาก PowerShell คุณสามารถใช้ Schedule.Service อินเทอร์เฟซ COM (หรืออัปเดตเวอร์ชัน PowerShell) ในตัวอย่างนี้ เราสร้างงานที่กำหนดเวลาไว้ซึ่งจะรันไฟล์เฉพาะที่มีสคริปต์ PowerShell ในระหว่างการเริ่มต้น งานจะดำเนินการด้วย NT AUTHORITY\SYSTEM สิทธิพิเศษ

$TaskName = "NewPsTask"
$TaskDescription = "Running PowerShell script from Task Scheduler"
$TaskCommand = "c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe"
$TaskScript = "C:\PS\StartupScript.ps1"
$TaskArg = "-WindowStyle Hidden -NonInteractive -Executionpolicy unrestricted -file $TaskScript"
$TaskStartTime = [datetime]::Now.AddMinutes(1)
$service = new-object -ComObject("Schedule.Service")
$service.Connect()
$rootFolder = $service.GetFolder("\")
$TaskDefinition = $service.NewTask(0)
$TaskDefinition.RegistrationInfo.Description = "$TaskDescription"
$TaskDefinition.Settings.Enabled = $true
$TaskDefinition.Settings.AllowDemandStart = $true
$triggers = $TaskDefinition.Triggers
#https://msdn.microsoft.com/en-us/library/windows/desktop/aa383915(v=vs.85).aspx
$trigger = $triggers.Create(8)

วิธีการดูและเรียกใช้งานที่กำหนดเวลาไว้ด้วย PowerShell

คุณแสดงรายการงานที่กำหนดเวลาไว้ทั้งหมดบน 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 :

วิธีสร้างและจัดการงานที่กำหนดเวลาไว้ด้วย PowerShell

คุณสามารถปิดใช้งานงานนี้:

Get-ScheduledTask CheckServiceState | Disable-ScheduledTask

วิธีเปิดใช้งาน:

Get-ScheduledTask CheckServiceState | Enable-ScheduledTask

หากต้องการเรียกใช้งานทันที (โดยไม่ต้องรอกำหนดการ) ให้เรียกใช้:

Start-ScheduledTask CheckServiceState

วิธีสร้างและจัดการงานที่กำหนดเวลาไว้ด้วย PowerShell

หากต้องการลบงานออกจากไลบรารี Task Scheduler โดยสมบูรณ์:

Unregister-ScheduledTask -TaskName CheckServiceState

หากคุณต้องการเปลี่ยนชื่อผู้ใช้ที่ใช้เริ่มงาน ตัวอย่างเช่น โหมดความเข้ากันได้ ให้ใช้ Set-ScheduledTask cmdlet:

$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 ” ตรวจสอบว่าคุณระบุชื่อผู้ใช้ที่ถูกต้อง

วิธีสร้างและจัดการงานที่กำหนดเวลาไว้ด้วย PowerShell

จะส่งออกและนำเข้างานที่กำหนดเวลาไว้ผ่านไฟล์ XML ได้อย่างไร

PowerShell ช่วยให้คุณสามารถส่งออกการตั้งค่าปัจจุบันของงานที่กำหนดเวลาไว้ลงในไฟล์ XML แบบข้อความ ดังนั้น คุณจึงสามารถส่งออกพารามิเตอร์ของงานใดๆ และปรับใช้งานกับคอมพิวเตอร์เครื่องอื่นได้ งานอาจถูกส่งออกทั้งจาก Task Scheduler GUI และจากคอนโซล PowerShell

นี่คือคำสั่งเพื่อส่งออกงานที่มีชื่อว่า StartupScript ไปยังไฟล์ StartupScript.xml:

Export-ScheduledTask StartupScript | out-file c:\tmp\StartupScript.xml

วิธีสร้างและจัดการงานที่กำหนดเวลาไว้ด้วย PowerShell

cmdlet ของ Export-ScheduledTask ไม่มีใน PowerShell 2.0 ดังนั้นใน Windows 7 / Windows Server 2008 R2 ควรใช้เครื่องมือในตัว schtasks เพื่อส่งออกการตั้งค่างานและเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์ข้อความ:

schtasks /query /tn "NewPsTask" /xml >> "c:\tmp\NewPsTask.xml"

หลังจากส่งออกการตั้งค่างานตามกำหนดเวลาไปยังไฟล์ XML แล้ว ก็สามารถนำเข้าไปยังคอมพิวเตอร์เครือข่ายใดก็ได้โดยใช้ GUI, SchTasks.exe หรือ PowerShell

Register-ScheduledTask cmdlet สามารถช่วยคุณนำเข้าการตั้งค่างานจากไฟล์ XML และลงทะเบียนได้:
Register-ScheduledTask -Xml (Get-Content “\\mun-fs01\public\NewPsTask.xml” | out-string) -TaskName "NewPsTask"
ใน PowerShell 2.0 (Windows 7/Server 2008 R2) การนำเข้างานโดยใช้เครื่องมือ schtasks จะง่ายกว่า คำสั่งแรกสร้างงานใหม่ วินาทีจะเรียกใช้ทันที (โดยไม่ต้องรอให้ทริกเกอร์เปิดใช้งาน)

schtasks /create /tn "NewPsTask" /xml "\\Srv1\public\NewPsTask.xml" /ru corp\skrutapal /rp Pa$$w0rd
schtasks /Run /TN "NewPsTask"

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