Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Máy Chủ Windows

Cách tạo và quản lý Task Scheduled với PowerShell

Hầu hết người dùng và quản trị viên dùng giao diện đồ họa taskschd.msc để tạo và quản lý tác vụ được lên lịch trên Windows. Tuy nhiên, trong các script và quy trình tự động, việc sử dụng tính năng PowerShell để tạo tác vụ Scheduled Tasks 훨씬 tiện lợi hơn. Trong bài viết này, chúng tôi sẽ chỉ cách tạo và quản lý tác vụ Windows Scheduler bằng PowerShell.

Quản lý Scheduled Tasks trên Windows qua PowerShell

Module PowerShell ScheduledTasks được dùng để quản lý tác vụ được lên lịch trên Windows 10/Windows Server 2016. Bạn có thể liệt kê các cmdlet trong module như sau:

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

Mẹo. Trước đây, công cụ bảng điều khiển tích hợp schtasks.exe được dùng trong Windows để tạo và quản lý tác vụ scheduler.

Tạo Scheduled Task với Windows PowerShell

Trong các phiên bản PowerShell hiện đại (bắt đầu từ PowerShell 3.0 trên Windows Server 2012/Windows 8), bạn có thể dùng cmdlet New-ScheduledTaskTrigger và Register-ScheduledTask để tạo tác vụ được lên lịch.

Giả sử, chúng ta cần tạo một tác vụ được lên lịch chạy khi khởi động (hoặc tại thời điểm cụ thể) và thực thi một số script hoặc lệnh PowerShell. Hãy tạo tác vụ được lên lịch tên StartupScript1. Tác vụ này nên chạy file script PowerShell C:\PS\StartupScript.ps1 lúc 10:00 AM mỗi ngày. Tác vụ sẽ được thực thi với quyền nâng cao (checkbox "Run with highest privileges") dưới tài khoản 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

Nếu tác vụ tạo thành công, trạng thái "Ready" xuất hiện.

Script PowerShell của bạn sẽ chạy theo lịch chỉ định. Nếu bạn bật Chính sách thực thi PowerShell trên máy tính ngăn chặn thực thi script PS1, bạn có thể chạy script PowerShell từ tác vụ được lên lịch với tham số –Bypass.

Dùng mã này khi tạo tác vụ mới:

$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "–NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File C:\PS\StartupScript.ps1"

Mẹo. Nếu bạn muốn tác vụ chạy mỗi khi khởi động máy tính, lệnh đầu tiên phải như sau:
$Trigger= New-ScheduledTaskTrigger -AtStartup
Nếu bạn muốn chạy tác vụ khi người dùng đăng nhập:
$Trigger= New-ScheduledTaskTrigger -AtLogon

Mở bảng điều khiển taskschd.msc và đảm bảo bạn có tác vụ scheduler mới trong Thư viện Task Scheduler.

Trong PowerShell 2.0 (Windows 7, Windows Server 2008 R2), để tạo tác vụ được lên lịch từ PowerShell, bạn có thể dùng giao diện COM Schedule.Service (hoặc cập nhật phiên bản PowerShell). Trong ví dụ này, chúng ta tạo tác vụ được lên lịch sẽ thực thi file cụ thể chứa script PowerShell khi khởi động. Tác vụ được thực hiện với đặc quyền 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)

Cách xem và chạy Scheduled Tasks với PowerShell?

Bạn có thể liệt kê tất cả tác vụ được lên lịch đang hoạt động trên Windows với lệnh:

Get-ScheduledTask -TaskPath | ? state -ne Disabled

Để lấy thông tin về một tác vụ cụ thể:

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 : 

Bạn có thể vô hiệu hóa tác vụ này:

Get-ScheduledTask CheckServiceState | Disable-ScheduledTask

Để bật tác vụ:

Get-ScheduledTask CheckServiceState | Enable-ScheduledTask

Để chạy tác vụ ngay lập tức (không chờ lịch), chạy:

Start-ScheduledTask CheckServiceState

Để xóa hoàn toàn tác vụ khỏi thư viện Task Scheduler:

Unregister-ScheduledTask -TaskName CheckServiceState

Nếu bạn cần thay đổi tên người dùng chạy tác vụ và, ví dụ, chế độ tương thích, dùng 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

Nếu nhận lỗi "Set-ScheduledTask: No mapping between account names and security IDs was done", hãy kiểm tra xem bạn cung cấp tên người dùng đúng chưa.

Cách Export và Import Scheduled Tasks qua file XML?

PowerShell cho phép bạn xuất cài đặt hiện tại của bất kỳ tác vụ được lên lịch nào ra file văn bản XML. Vì vậy, bạn có thể xuất tham số của bất kỳ tác vụ nào và triển khai tác vụ đến máy tính khác. Tác vụ có thể xuất cả từ GUI Task Scheduler và từ bảng điều khiển PowerShell.

Dưới đây là lệnh để xuất tác vụ tên StartupScript ra file StartupScript.xml:

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

Cmdlet Export-ScheduledTask không có sẵn trong PowerShell 2.0, nên trong Windows 7 / Windows Server 2008 R2 tốt hơn dùng công cụ tích hợp schtasks để xuất cài đặt tác vụ và chuyển hướng kết quả vào file văn bản:

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

Sau khi cài đặt tác vụ được lên lịch được xuất ra file XML, nó có thể nhập vào bất kỳ máy tính mạng nào bằng GUI, SchTasks.exe hoặc PowerShell.

Cmdlet Register-ScheduledTask có thể giúp bạn nhập cài đặt tác vụ từ file XML và đăng ký nó:
Register-ScheduledTask -Xml (Get-Content "\\mun-fs01\public\NewPsTask.xml" | out-string) -TaskName "NewPsTask"
Trong PowerShell 2.0 (Windows 7/Server 2008 R2), dễ dàng hơn nhập tác vụ bằng công cụ schtasks. Lệnh đầu tiên tạo tác vụ mới. Lệnh thứ hai sẽ chạy nó ngay lập tức (không chờ trigger kích hoạt).

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

Lưu ý rằng ví dụ này dùng thông tin đăng nhập của tài khoản dùng để chạy tác vụ. Nếu thông tin đăng nhập không được chỉ định, vì chúng không được lưu trong tác vụ, chúng sẽ được yêu cầu khi nhập.