Створення завдання планувальника з допомогою PowerShell

Більшість користувачів і адміністраторів для створення завдання планувальника Windows (Task Scheduler), що запускається за розкладом, звикли використовувати графічний інтерфейс консолі Taskschd.msc. Однак в різних скриптах і автоматизуються завдання для створення завдань планувальника набагато зручніше використовувати можливості PowerShell. У цій статті ми покажемо як за допомогою PowerShell (версії 2.0 і 4.0) створювати нові завдання планувальника Windows, експортувати завдання в xml файл і імпортувати їх на інші комп'ютери.

Припустимо, наша задача створити завдання планувальника яке б запускалося при завантаженні системи (або в певний час), завдання має виконувати якийсь PowerShell скрипт або команду.

зміст:

  • Як створити завдання планувальника в PowerShell 2.0
  • Як створити завдання планувальника в PowerShell 4.0 (Windows Server 2012 R2)
  • Експорт завдання планувальника в XML файл
  • Імпорт завдання планувальника з XML файлу

Як створити завдання планувальника в PowerShell 2.0

У версії Powershell 2.0 (Windows 7, Windows Server 2008 R2) для створення повторюваного завдання (ScheduledJob) з PowerShell необхідно скористатися COM інтерфейсом Schedule.Service.  У цьому прикладі ми створимо завдання планувальника, яке під час завантаження системи має виконати певний файл з PowerShell скриптом. Завдання виконується з правами системи (System).

$ TaskName = "NewPsTask"
$ TaskDescription = "Запуск скрипта PowerShell з планувальника"
$ 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
#http: //msdn.microsoft.com/en-us/library/windows/desktop/aa383915 (v = vs.85) .aspx
$ Trigger = $ triggers.Create (8)

Примітка. У цьому випадку створюється тригер, що спрацьовує при завантаженні системи - код 8. Повний список кодів:

TASK_TRIGGER_EVENT0
TASK_TRIGGER_TIME1
TASK_TRIGGER_DAILY2
TASK_TRIGGER_WEEKLY3
TASK_TRIGGER_MONTHLY4
TASK_TRIGGER_MONTHLYDOW5
TASK_TRIGGER_IDLE6
TASK_TRIGGER_REGISTRATION7
TASK_TRIGGER_BOOT8
TASK_TRIGGER_LOGON9
TASK_TRIGGER_SESSION_STATE_CHANGE11

$ Trigger.StartBoundary = $ TaskStartTime.ToString ( "yyyy-MM-dd'T'HH: mm: ss")
$ Trigger.Enabled = $ true
# http://msdn.microsoft.com/en-us/library/windows/desktop/aa381841(v=vs.85).aspx
$ Action = $ TaskDefinition.Actions.Create (0)
$ Action.Path = "$ TaskCommand"
$ Action.Arguments = "$ TaskArg"
#http: //msdn.microsoft.com/en-us/library/windows/desktop/aa381365 (v = vs.85) .aspx
$ RootFolder.RegisterTaskDefinition ( "$ TaskName", $ TaskDefinition, 6, "System", $ null, 5)

Після виконання команди в планувальнику з'явиться нове завдання NewPsTask.

Синтаксис команд досить складний, тому розробники додали в PowerShell Pack (є частиною Windows 7 Resource Kit) окремий модуль TaskScheduler, який істотно спрощує процес створення завдань планувальника з PowerShell 2.0. Після установки модуля створити завдання можна за допомогою таких команд:

Import-Module TaskScheduler $ task = New-Task
$ Task.Settings.Hidden = $ true
Add-TaskAction -Task $ task -Path C: \ Windows \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe -Arguments "-File C: \ MyScript.ps1"
Add-TaskTrigger -Task $ task -Daily -At "10:00"
Register-ScheduledJob -Name "ShTaskPs" -Task $ task

Як створити завдання планувальника в PowerShell 4.0 (Windows Server 2012 R2)

У Windows Server 2012 R2 і Windows 8.1 у версії PowerShell 3.0 і 4.0 з'явилися нові командлети для створінь завдань планувальника: New-ScheduledTaskTrigger, Register-ScheduledTask. Створити завдання планувальника тепер можна набагато простіше і зручніше.

Створимо завдання з ім'ям StartupScript_PS, яке кожен день о 10:00 з-під облікового запису системи (SYSTEM) запускає PoSh скрипт, що зберігається у файлі C: \ PS \ StartupScript.ps1. Завдання буде виконуватися з підвищеними привілеями (галка "Run with highest privileges").

$ Trigger = New-ScheduledTaskTrigger -At 10:00 am -Daily
$ User = "NT AUTHORITY \ SYSTEM"
$ Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "C: \ PS \ StartupScript.ps1"
Register-ScheduledTask -TaskName "StartupScript_PS" -Trigger $ Trigger -User $ User -Action $ Action -RunLevel Highest -Force

Порада. Якщо потрібно, щоб завдання запускалося кожного разу при завантаженні системи, перша команда повинна бути такою:
$ Trigger = New-ScheduledTaskTrigger -AtStartup
Якщо при вході користувача в систему:
$Trigger = New-ScheduledTaskTrigger -AtLogon

Перевіримо, що в планувальнику з'явилося нове завдання.

Експорт завдання планувальника в XML файл

PowerShell надає можливість експортувати поточні настройки будь-якого завдання планувальника в текстовий XML файл. Таким чином можна вивантажити параметри будь-якого завдання і поширити завдання будь-якої складності на інші комп'ютери мережі. Експорт завдання можуть виконати як з графічного інтерфейсу Task Scheduller, так і з командою рядка PowerShell.

Команда експорту завдання з ім'ям StartupScript_PS в файл StartupScript_PS.xml:

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

Командлет Export-ScheduledTask не працюватиме в PowerShell 2.0, тому в Windows 7/2008 R2 для експорту налаштувань завдання в XML файл краще скористатися вбудованою утилітою schtasks, висновок якої потрібно перенаправити в текстовий файл:

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

Порада. Нагадаємо, що раніше для створення і управління завданнями планувальника в основному використовувалися можливості вбудованої консольної утиліти schtasks.exe.

Імпорт завдання планувальника з XML файлу

Після того, як налаштування завдання планувальника експортовані в XML файл, його можна імпортувати на будь-який інший комп'ютер мережі з допомогою графічної консолі, SchTasks.exe або PowerShell.

Імпортувати параметри завдання і зареєструвати його допоможе командлет Register-ScheduledTask.

Register-ScheduledTask -Xml (Get-Content "\\ Server1 \ public \ NewPsTask.xml" | out-string) -TaskName "NewPsTask"

У PowerShell 2.0 (Windows 7 / Server 2008 R2) імпорт завдання також простіше виконати за допомогою утиліти schtasks. Перша команда створить нове завдання. Друга - відразу запустить його (не чекаючи спрацьовування тригера).

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

Примітка. Зверніть увагу, що в цьому прикладі вказані дані облікового запису, з-під якої буде запускатися завдання. Якщо дані облікового запису користувача будуть вказані, то тому вони не зберігаються в завданні, вони будуть запитані при імпорті.