- Обзор
- Соглашение о переменных
- Шаг 1: Регистрация задачи и базовые настройки
- Шаг 2: Запуск по событиям журнала (XML-шаблон)
- Шаг 3: Комбинация условных триггеров и условий выполнения
- Шаг 4: Управление существующими задачами
- Включение эксплуатационного журнала (Operational)
- Шаг 5: Диагностика и проверка логов
- Шаг 6: Рекомендуемые настройки
- Итоги
Обзор
В статье разобраны продвинутые приёмы автоматизации с Планировщиком заданий Windows.
Описаны условные триггеры, запуск по журналу событий, регистрация и управление задачами через PowerShell, а также практики безопасной эксплуатации.
Соглашение о переменных
| Переменная | Пример | Примечание |
|---|---|---|
<<TASK_NAME>> |
Daily-Backup |
Имя задачи |
<<SCRIPT_PATH>> |
C:\Scripts\backup.ps1 |
Путь к исполняемому скрипту |
<<EVENT_ID>> |
4625 |
Целевой ID события |
<<USERNAME>> |
Administrator |
Учетная запись для запуска |
<<TASK_PATH>> |
\MyCompany\Maintenance |
Папка в библиотеке задач (опц.) |
Шаг 1: Регистрация задачи и базовые настройки
При регистрации задачи через PowerShell используются три основных cmdlet:
| Cmdlet | Назначение |
|---|---|
New-ScheduledTaskAction |
Определяет исполняемую программу/скрипт |
New-ScheduledTaskTrigger |
Определяет момент запуска (время/событие) |
Register-ScheduledTask |
Регистрирует полную задачу (Action + Trigger + Settings) |
① Параметры New-ScheduledTaskAction
| Параметр | Описание | Пример |
|---|---|---|
-Execute |
Исполняемый файл | "powershell.exe" |
-Argument |
Аргументы командной строки | "-NoProfile -NonInteractive -ExecutionPolicy Bypass -File <<SCRIPT_PATH>>" |
-WorkingDirectory |
Рабочий каталог | "C:\Scripts" |
-Id |
Идентификатор действия (для нескольких) | "Action1" |
💡 Для нескольких действий создайте несколько объектов
New-ScheduledTaskActionи передайте массив.
② Параметры New-ScheduledTaskTrigger
| Параметр | Описание | Пример |
|---|---|---|
-Daily |
Ежедневный запуск | вместе с -At 3:00AM |
-Weekly |
Еженедельный | -DaysOfWeek Monday,Wednesday |
-Once |
Однократно | -At (Get-Date).AddHours(1) |
-AtStartup |
При старте системы | — |
-AtLogOn |
При входе пользователя | — |
-RepetitionInterval |
Интервал повторения | (New-TimeSpan -Minutes 30) |
-RepetitionDuration |
Общая длительность повторов | (New-TimeSpan -Days 1) |
-RandomDelay |
Случайная задержка | (New-TimeSpan -Minutes 5) |
-StartBoundary / -EndBoundary |
Период действия | "2025-01-01T00:00:00" |
⚠️
-RepetitionIntervalи-RepetitionDurationработают только для ряда типов триггеров (например, Daily/Once).
③ New-ScheduledTaskSettingsSet (дополнительно)
| Параметр | Описание | Пример |
|---|---|---|
-AllowStartIfOnBatteries |
Разрешить на батарее | $false |
-DontStopIfGoingOnBatteries |
Не останавливать при переходе на батарею | $false |
-StartWhenAvailable |
Запуск при появлении условий | $true |
-Hidden |
Скрыть задачу | $true |
-RunOnlyIfNetworkAvailable |
Только при наличии сети | $true |
-ExecutionTimeLimit |
Лимит времени выполнения | (New-TimeSpan -Hours 2) |
-MultipleInstances |
Политика многократных экземпляров (IgnoreNew/Parallel/Queue) | "IgnoreNew" |
-RestartCount / -RestartInterval |
Повторы и интервал | 3, (New-TimeSpan -Minutes 5) |
💡
New-ScheduledTaskSettingsSetформирует объект настроек для-Settings, централизуя энергетику, сеть и повторы.
④ Важные параметры Register-ScheduledTask
| Параметр | Описание | Пример |
|---|---|---|
-TaskName |
Имя задачи | "Daily-Backup" |
-TaskPath |
Путь в библиотеке | "\MyCompany\Maintenance" |
-Action |
Действие(я) | $action |
-Trigger |
Триггер(ы) | $trigger |
-Settings |
Доп. настройки | $settings |
-Description |
Описание | "Daily maintenance backup task" |
-User |
Учетная запись | "SYSTEM" или "Administrator" |
-RunLevel |
Уровень прав | Highest |
-Force |
Перезапись при наличии | — |
💡 Полная задача — комбинация Action, Trigger и Settings.
⑤ Пример конфигурации
# Действие
$action = New-ScheduledTaskAction -Execute "powershell.exe" `
-Argument "-NoProfile -ExecutionPolicy Bypass -File <<SCRIPT_PATH>>"
# Триггер (ежедневно в 03:00)
$trigger = New-ScheduledTaskTrigger -Daily -At 3:00AM
# Регистрация
Register-ScheduledTask -TaskName "<<TASK_NAME>>" `
-TaskPath "<<TASK_PATH>>\Daily" `
-Action $action -Trigger $trigger `
-User "<<USERNAME>>" -Description "Ежедневная запланированная задача на 03:00"
⑥ Замечания
-ExecutionPolicy Bypassиспользуйте только внутри периметра; рассмотрите подписанные скрипты.- Предпочтительны SYSTEM или отдельная служебная учетная запись.
- Минимальный
-RepetitionInterval— 1 минута; типовой предел-RepetitionDuration— 1 день. - Для перезаписи требуется
-Force. -RunLevel Highest— только для действий, требующих админ-прав.
Шаг 2: Запуск по событиям журнала (XML-шаблон)
New-ScheduledTaskTrigger в PowerShell по-прежнему не поддерживает нативный триггер по событию (например, -OnEvent).
Для запуска по событиям импортируйте XML-описание.
Регистрация:
$xml = @'
<Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Author><<USERNAME>></Author>
<Description>Запуск скрипта при событии EventID <<EVENT_ID>></Description>
</RegistrationInfo>
<Triggers>
<EventTrigger>
<Enabled>true</Enabled>
<Subscription><![CDATA[
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">*[System[(EventID=<<EVENT_ID>>)]]</Select>
</Query>
</QueryList>
]]></Subscription>
</EventTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>SYSTEM</UserId>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<ExecutionTimeLimit>PT1H</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</Command>
<Arguments>-NoProfile -ExecutionPolicy Bypass -File "<<SCRIPT_PATH>>"</Arguments>
</Exec>
</Actions>
</Task>
'@
Register-ScheduledTask -TaskName "<<TASK_NAME>>" -TaskPath "<<TASK_PATH>>\OnEvent" -Xml $xml -User "SYSTEM"
Шаг 3: Комбинация условных триггеров и условий выполнения
Определяйте «условия» задачи (питание, сеть, простой) через New-ScheduledTaskSettingsSet.
$settings = New-ScheduledTaskSettingsSet `
-AllowStartIfOnBatteries:$false `
-DontStopIfGoingOnBatteries:$false `
-StartWhenAvailable:$true `
-Hidden:$false `
-RunOnlyIfNetworkAvailable:$true `
-ExecutionTimeLimit (New-TimeSpan -Hours 2)
Register-ScheduledTask -TaskName "<<TASK_NAME>>_Cond" `
-TaskPath "<<TASK_PATH>>\Conditional" `
-Action $action -Trigger $trigger -Settings $settings `
-User "<<USERNAME>>" -Description "Условная задача (требуется сеть / питание от сети)"
Часто используемые условия
| Условие | Параметр | Пояснение |
|---|---|---|
| Только от сети (AC) | -AllowStartIfOnBatteries:$false |
Не запускать на батарее |
| Требуется сеть | -RunOnlyIfNetworkAvailable:$true |
Пропуск без соединения |
| Только в режиме простоя | XML или COM | Нативная поддержка в PowerShell ограничена |
| Лимит времени | -ExecutionTimeLimit |
Защита от «зависших» задач |
| Повторы | Через XML или триггер-повтор | В PowerShell есть ограничения |
Шаг 4: Управление существующими задачами
# Список задач
Get-ScheduledTask | Where-Object TaskPath -like "<<TASK_PATH>>*"
# Вкл./выкл.
Enable-ScheduledTask -TaskName "<<TASK_NAME>>"
Disable-ScheduledTask -TaskName "<<TASK_NAME>>"
# Состояние
Get-ScheduledTaskInfo -TaskName "<<TASK_NAME>>" |
Select-Object TaskName, NextRunTime, LastRunTime, LastTaskResult
Включение эксплуатационного журнала (Operational)
Канал Microsoft-Windows-TaskScheduler/Operational может быть отключен по умолчанию.
Включите его для диагностики и детальной истории.
wevtutil sl Microsoft-Windows-TaskScheduler/Operational /e:true
Шаг 5: Диагностика и проверка логов
# Последний результат выполнения
Get-ScheduledTaskInfo -TaskName "<<TASK_NAME>>"
# Фильтр эксплуатационного журнала по имени задачи
Get-WinEvent -LogName "Microsoft-Windows-TaskScheduler/Operational" -MaxEvents 50 |
Where-Object { $_.Message -match "<<TASK_NAME>>" } |
Select-Object TimeCreated, Id, Message | Format-Table -AutoSize
Типовые причины и меры
| Причина | Действие |
|---|---|
| Недостаточно прав | Пересмотреть права / использовать сервисную учетную запись |
| Блокировка ExecutionPolicy | Подписанный скрипт или -ExecutionPolicy Bypass |
Не задан TaskPath/описание |
Указать -TaskPath и -Description для управляемости |
| Не срабатывает триггер события | Проверить XML и фильтр события |
| Конфликт условий | Пересмотреть логику триггеров и настроек |
Шаг 6: Рекомендуемые настройки
- Используйте SYSTEM или выделенную сервисную учетную запись по принципу минимальных привилегий.
- В скриптах реализуйте логирование и обработку исключений; фиксируйте успех/ошибки.
- Версионируйте описания задач в XML (например, в GitHub).
- Периодически мониторьте через
Get-ScheduledTaskInfo, настраивайте оповещения об отклонениях. - Удаляйте устаревшие задачи
Unregister-ScheduledTask, держите библиотеку в порядке.
Итоги
Планировщик заданий Windows — это не только таймерные запуски.
С триггерами по событиям, условным запуском и интеграцией с PowerShell он превращается в мощную платформу автоматизации.
Стандартизируя регистрацию, управление и мониторинг кодом, вы получаете воспроизводимость, управляемость и безопасность эксплуатации.
