Создание и управление заданиями планировщика из PowerShell

Для управления повторяющимися заданиями планировщика Windows Task Scheduler вместо графической оснастки taskschd.msc или устаревшей консольной утилиты schtasks.exe можно использовать возможности PowerShell. В этой статье мы рассмотрим, как с помощью PowerShell создавать, редактировать, удалять и запускать задания планировщика в Windows.

В современных версиях Windows для управления задачами планировщике доступен встроенный PowerShell модуль ScheduledTasks. Список командлетов в модуле можно вывести так:

Get-Command -Module ScheduledTasks

powershell командлеты из модуля ScheduledTasks

Как создать новое задание в планировщике с помощью PowerShell?

Рассмотрим, как из консоли PowerShell создать новое задание планировщика. Предположим, вы хотите создать в планировщике задание, которое должно запускаться при загрузке компьютера (или в определенное время) и выполнять какой-то PowerShell скрипт. При создании нового задания нужно указать как минимум следующие его параметры:

  • Action – действие, которое выполняет задание (запустить команду, программу, скрипт). Для создания объекта используется командлет New-ScheduledTaskAction
  • Trigger – определяет, когда нужно выполнить задание (по определенному расписанию или при наступлении события): New-ScheduledTaskTrigger
  • Principal – учетная запись, из под которое выполняется задание: New-ScheduledTaskPrincipal

Сначала нужно указать имя задания:

$NewTaskName = "StartupScript_PS"

Укажем пользователя, из под-которого нужно запускать задание (в этом примере мы будем запускать скрипт с правами учетной записи SYSTEM).

$User="NT AUTHORITY\SYSTEM"

Для запуска задания от определенного пользователя, укажите его в формате:

$User = "winitpro\adm"

Для запуска задания от пользователя его учетная запись должна быть добавлена в локальную политику «Log on as a batch job».

Можно запускать задания от имени сервисных учетных записей AD (gMSA):

$svcUserPrincipal = New-ScheduledTaskPrincipal -UserID winitpro\sql01$ -LogonType Password

Далее с помощью New-ScheduledTaskTrigger нужно создать триггер, определяющий время запуска задания. Здесь можно использовать системные события:

  • AtLogOn — при входе пользователя в систему
  • AtStartup — во время загрузки компьютера

Или указать время:

  • Once – запустить задание однократно
  • At – задать точное время выполнения
  • Daily – ежедневно
  • DaysOfWeek – в определенные дни недели
  • Weekly — запуск в определенные недели месяца
  • WeeksInterval — интервал между неделями

Например, чтобы запускать задачу по расписанию ежедневно в 10:00:

$Trigger = New-ScheduledTaskTrigger -At 10:00am -Daily

Совет. Другие варианты расписания:

  • Запускать при каждой загрузке компьютера: $Trigger = New-ScheduledTaskTrigger -AtStartup
  • Выполнять при входе пользователя: $Trigger = New-ScheduledTaskTrigger –AtLogon
  • Однократный запуск в указанное время: $Trigger= New-ScheduledTaskTrigger -Once -At 13:00
  • Каждый второй вторник: $Trigger = New-ScheduledTaskTrigger -Weekly -WeeksInterval 2 -DaysOfWeek Tuesday -At 13:00

Указываем, что должно делать наше задание (в данном случае нужно запустить указанный PowerShell скрипт):

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

В данном случае параметр -Bypass позволяет запускать PowerShell скрипт по расписанию из планировщика не зависимо от настроек PowerShell Execution Policy

Теперь можно создать задание с указанными настройками:

Register-ScheduledTask -TaskName $NewTaskName -Trigger $Trigger -User $User -Action $Action -RunLevel Highest –Force

Опция -RunLevel Highest указывает, что задание будет выполняться с повышенными привилегиями (галка “Run with highest privileges”).

Если задание успешно создано, появится надпись Ready.

создать задание планировщика с помощью Register-ScheduledTask

Откройте консоль Taskschd.msc и проверьте, что в Task Scheduler Library появилось новое задание планировщика.

консоль Task Scheduler с новым заданием планировщика

В версии Powershell 2.0 (Windows 7, Windows Server 2008 R2) для создания повторяющегося задания (ScheduledJob) из PowerShell необходимо воспользоваться COM интерфейсом Schedule.Service (либо обновите версию PowerShell). В этом примере мы создадим задание планировщика, которое запускает определённый файл с PowerShell скриптом во время загрузки:

$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)

Изменить настройки задания планировщика из PowerShell

Чтобы изменить настройки существующего задания планировщика, используется командлет Set-ScheduledTask.

Изменить время запуска (добавить несколько триггеров), изменить выполняемое действие:

$Trigger1 = New-ScheduledTaskTrigger -At 12:00 -Weekly -DaysOfWeek Monday
$Trigger2= New-ScheduledTaskTrigger -At 12:00 -Weekly -DaysOfWeek Friday
$action = New-ScheduledTaskAction -Execute "Calc.exe"
Set-ScheduledTask -TaskName StartupScript_PS -Trigger $trigger1, $trigger2 -Action $action 

Изменить имя пользователя, из-под которого запускается задание и, например, режим совместимости:

$task_user = New-ScheduledTaskPrincipal -UserId 'winitpro\kbuldogov' -RunLevel Highest
$task_settings = New-ScheduledTaskSettingsSet -Compatibility 'Win8'
Set-ScheduledTask -TaskName StartupScript_PS -Principal $task_user -Settings $task_settings

При появлении ошибки Set-ScheduledTask : No mapping between account names and security IDs was done, проверьте, что у вас указано правильное имя пользователя.

Set-ScheduledTask : No mapping between account names and security IDs was done

Управление заданиями планировщика из PowerShell

Вы можете вывести список всех активных заданий планировщика в Windows с помощью команды:

Get-ScheduledTask -TaskPath | ? state -ne Disabled

Команда выведет время предыдущего запуска задания (и код ошибки) и время следующего запуска.

Get-ScheduledTask CheckServiceState_PS| Get-ScheduledTaskInfo

LastRunTime : 4/6/2025 10:00:00 AM
LastTaskResult : 267011
NextRunTime : 4/7/2025 10:00:00 AM
NumberOfMissedRuns : 0
TaskName : CheckServiceState_PS
TaskPath : \
PSComputerName :

информация о запуске задания Get-ScheduledTaskInfo

Вывести полный список параметров задания:

$task = Get-ScheduledTask StartupScript_PS
$task.Settings

Get-ScheduledTask вывести настройки задания планировщика

Вы можете отключить это задание:

Get-ScheduledTask CheckServiceState_PS | Disable-ScheduledTask

Чтобы включить задание:

Get-ScheduledTask CheckServiceState_PS | Enable-ScheduledTask

Чтобы запустить задание немедленно (не дожидаясь расписания):

Start-ScheduledTask CheckServiceState_PS

отключить/включить/запустить задание планировщика с помощью PowerShell

Чтобы полностью удалить задание из Task Scheduler:

Unregister-ScheduledTask -TaskName CheckServiceState_PS

Экспорт и импорт заданий планировщика в XML файл

С помощью PowerShell можно экспортировать настройки заданий планировщика в текстовый XML файл (это удобно, когда нужно скопировать настроенные задания на другие компьютеры, или создать резевную копию).

Следующая команда экспортирует задание StartupScript_PS в файл StartupScript_PS.xml:

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

Export-ScheduledTask - импорт задания планировщика в xml файла

Чтобы импортировать это задание на другом компьютере, укажите путь к полученному XML файле в параметрах командлета Register-ScheduledTask:

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


Предыдущая статья Следующая статья


Комментариев: 15 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)