Большинство пользователей и администраторов для создания задания планировщика Windows (Task Scheduler), запускаемого по расписанию, привыкли использовать графический интерфейс консоли Taskschd.msc. Однако в различных скриптах и автоматизируемых задачах для создания заданий планировщика гораздо удобнее использовать возможности PowerShell. В этой статье мы покажем как с помощью PowerShell (версии 2.0 и 4.0) создавать новые задания планировщика Windows, экспортировать задания в xml файл и импортировать их на другие компьютеры.
Предположим, наша задача создать задание планировщика которое бы запускалось при загрузке системы (или в определенное время), задание должно выполнять некий PowerShell скрипт или команду.
Как создать задание планировщика в 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:00am -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"