Більшість користувачів і адміністраторів для створення завдання планувальника 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_EVENT | 0 |
TASK_TRIGGER_TIME | 1 |
TASK_TRIGGER_DAILY | 2 |
TASK_TRIGGER_WEEKLY | 3 |
TASK_TRIGGER_MONTHLY | 4 |
TASK_TRIGGER_MONTHLYDOW | 5 |
TASK_TRIGGER_IDLE | 6 |
TASK_TRIGGER_REGISTRATION | 7 |
TASK_TRIGGER_BOOT | 8 |
TASK_TRIGGER_LOGON | 9 |
TASK_TRIGGER_SESSION_STATE_CHANGE | 11 |
$ 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"
Імпорт завдання планувальника з 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"