Windows 24 марта 2026 12 мин чтения ...
ЕС
Евгений Семёнов
Генеральный директор ООО АйТи Фреш · 15+ лет в IT

Планировщик заданий Windows: создание и управление задачами через PowerShell

Планировщик заданий Windows PowerShell

Планировщик заданий (Task Scheduler) — штука, без которой серьёзное администрирование Windows просто не представляю. Запуск задач по расписанию, по событию, при входе пользователя — всё это он умеет. Графическая консоль taskschd.msc вполне справляется, когда нужно разово что-то настроить. Но стоит встать задача развернуть 30 одинаковых заданий на 15 серверах или перенести конфигурацию при миграции — и без PowerShell не уедешь.

В этом материале разберём модуль ScheduledTasks — от базовых вещей до реальных сценариев, с которыми мы сталкиваемся в работе. Создание, изменение, экспорт, удаление задач — всё из командной строки. Плюс разберём цепочки зависимых заданий: например, бэкап → очистка → отправка отчёта.

Модуль ScheduledTasks: проверка и подключение

Начиная с Windows 8 и Server 2012 модуль ScheduledTasks идёт в комплекте с системой — ставить ничего не нужно. Первым делом проверяем, что он вообще доступен:

Get-Module -ListAvailable ScheduledTasks
Get-Command -Module ScheduledTasks | Format-Table Name, CommandType

Если модуль не нашёлся — скорее всего, система старая. В таком случае придётся работать через COM-объект Schedule.Service или старую добрую утилиту schtasks.exe. Но если у вас Windows 10/11 или Server 2016 и новее — берите штатный модуль, он удобнее во всех отношениях.

Совет: Для удалённого управления задачами используйте параметр -CimSession, который поддерживают все командлеты модуля ScheduledTasks. Это позволяет работать с десятками серверов из одной консоли.

Просмотр существующих задач

Перед тем как что-то создавать, всегда полезно понять, что уже есть в системе. Командлет Get-ScheduledTask возвращает полноценные объекты со всеми свойствами — можно фильтровать, сортировать, передавать в пайп:

# Все задачи, кроме отключённых
Get-ScheduledTask | Where-Object { $_.State -ne 'Disabled' } |
  Select-Object TaskName, TaskPath, State, LastRunTime |
  Sort-Object LastRunTime -Descending |
  Format-Table -AutoSize

Чтобы узнать, как отработало последнее выполнение задачи, есть связанный командлет:

Get-ScheduledTaskInfo -TaskName "Backup-Daily" |
  Select-Object LastRunTime, LastTaskResult, NextRunTime

Код 0 — всё прошло чисто. 0x1 — задача завершилась с ошибкой, надо разбираться. 0x41301 — задача до сих пор висит в процессе выполнения.

Совет: Экспортируйте список задач в CSV для документирования: Get-ScheduledTask | Export-Csv -Path C:\Reports\tasks.csv -NoTypeInformation -Encoding UTF8

Создание задачи: базовый сценарий

Создание задачи через PowerShell — три шага. Сначала описываем действие (Action), потом триггер (Trigger), затем регистрируем задачу в системе. Вот классика жанра — ежедневный бэкап:

# 1. Действие — запуск скрипта
$action = New-ScheduledTaskAction `
    -Execute "PowerShell.exe" `
    -Argument "-NoProfile -ExecutionPolicy Bypass -File C:\Scripts\Backup.ps1" `
    -WorkingDirectory "C:\Scripts"

# 2. Триггер — каждый день в 02:00
$trigger = New-ScheduledTaskTrigger -Daily -At "02:00"

# 3. Регистрация
Register-ScheduledTask `
    -TaskName "Backup-Daily" `
    -TaskPath "\ITfresh\" `
    -Action $action `
    -Trigger $trigger `
    -Description "Ежедневное резервное копирование данных" `
    -User "NT AUTHORITY\SYSTEM" `
    -RunLevel Highest

Параметр -TaskPath создаёт отдельную папку в планировщике — когда задач накапливается десяток-другой, это реально помогает не запутаться. -RunLevel Highest запускает задачу с повышенными привилегиями: нужно, если скрипт лезет в системные папки или реестр.

Внимание: При использовании -User "NT AUTHORITY\SYSTEM" задача выполняется от имени системы и не видна на рабочем столе пользователя. Если скрипт должен взаимодействовать с GUI, укажите конкретную учётную запись и параметр -AllowStartIfOnBatteries.

Типы триггеров: расписание на все случаи

Триггеры — пожалуй, самое гибкое место во всей этой системе. Вот что используем чаще всего:

# Однократный запуск
$once = New-ScheduledTaskTrigger -Once -At "2026-04-01 09:00"

# Еженедельно по понедельникам и средам
$weekly = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday,Wednesday -At "08:00"

# При входе пользователя в систему
$logon = New-ScheduledTaskTrigger -AtLogOn -User "DOMAIN\admin"

# При запуске компьютера
$startup = New-ScheduledTaskTrigger -AtStartup

# Повторение каждые 30 минут в течение 8 часов
$repeat = New-ScheduledTaskTrigger -Once -At "08:00" `
    -RepetitionInterval (New-TimeSpan -Minutes 30) `
    -RepetitionDuration (New-TimeSpan -Hours 8)

Несколько триггеров на одну задачу? Легко. Передаём массив в параметр -Trigger — и задача будет стартовать по любому из условий:

Register-ScheduledTask -TaskName "Multi-Trigger" `
    -Action $action -Trigger $startup, $weekly

Настройка параметров (Settings) задачи

Объект настроек — это отдельный разговор. Он управляет поведением задачи в нестандартных ситуациях: пропало сетевое подключение, машина ушла в сон, сел аккумулятор на ноутбуке. На серверах этим часто пренебрегают, а зря:

$settings = New-ScheduledTaskSettingsSet `
    -AllowStartIfOnBatteries `
    -DontStopIfGoingOnBatteries `
    -StartWhenAvailable `
    -RestartCount 3 `
    -RestartInterval (New-TimeSpan -Minutes 5) `
    -ExecutionTimeLimit (New-TimeSpan -Hours 2) `
    -MultipleInstances IgnoreNew

Register-ScheduledTask -TaskName "Robust-Task" `
    -Action $action -Trigger $trigger `
    -Settings $settings -User "SYSTEM"

Параметры, на которые обращаем внимание в первую очередь:

Изменение существующих задач

Командлет Set-ScheduledTask позволяет точечно поменять нужное свойство задачи — без удаления и пересоздания с нуля:

# Изменить время запуска
$newTrigger = New-ScheduledTaskTrigger -Daily -At "03:30"
Set-ScheduledTask -TaskName "Backup-Daily" -TaskPath "\ITfresh\" -Trigger $newTrigger

# Добавить второе действие
$action1 = New-ScheduledTaskAction -Execute "PowerShell.exe" `
    -Argument "-File C:\Scripts\Backup.ps1"
$action2 = New-ScheduledTaskAction -Execute "PowerShell.exe" `
    -Argument "-File C:\Scripts\SendReport.ps1"
Set-ScheduledTask -TaskName "Backup-Daily" -TaskPath "\ITfresh\" `
    -Action $action1, $action2

Быстро включить или выключить задачу — для этого есть отдельные командлеты, не нужно каждый раз лезть в настройки:

# Отключить задачу
Disable-ScheduledTask -TaskName "Backup-Daily" -TaskPath "\ITfresh\"

# Включить обратно
Enable-ScheduledTask -TaskName "Backup-Daily" -TaskPath "\ITfresh\"

Экспорт и импорт задач (миграция между серверами)

Task Scheduler хранит задачи в XML. Это значит, что конфигурацию можно экспортировать на одном сервере и импортировать на другом — именно так мы переносим задачи при миграциях:

# Экспорт в XML
Export-ScheduledTask -TaskName "Backup-Daily" -TaskPath "\ITfresh\" |
    Out-File -FilePath C:\Export\Backup-Daily.xml -Encoding UTF8

# Импорт на другом сервере
$xml = Get-Content -Path C:\Export\Backup-Daily.xml -Raw
Register-ScheduledTask -TaskName "Backup-Daily" `
    -TaskPath "\ITfresh\" -Xml $xml -User "SYSTEM"
Совет: Для массовой миграции создайте скрипт, который экспортирует все задачи из определённой папки: Get-ScheduledTask -TaskPath "\ITfresh\*" | ForEach-Object { Export-ScheduledTask -TaskName $_.TaskName -TaskPath $_.TaskPath | Out-File "C:\Export\$($_.TaskName).xml" }

Удаление задач и очистка

Удаление задачи — командлет Unregister-ScheduledTask. Работает и точечно, и пачкой:

# Удалить конкретную задачу (без подтверждения)
Unregister-ScheduledTask -TaskName "Old-Backup" -TaskPath "\ITfresh\" -Confirm:$false

# Удалить все задачи в папке
Get-ScheduledTask -TaskPath "\ITfresh\" |
    Unregister-ScheduledTask -Confirm:$false
Внимание: Удалённые задачи не попадают в корзину. Перед массовым удалением обязательно экспортируйте задачи в XML — это единственный способ восстановления.

Мониторинг и аудит задач

Периодически клиенты просят сделать отчёт по всем задачам: что есть, что включено, когда последний раз запускалось. Собираем через связку командлетов:

# Отчёт о задачах с ошибками за последние 24 часа
$cutoff = (Get-Date).AddDays(-1)
Get-ScheduledTask | ForEach-Object {
    $info = Get-ScheduledTaskInfo -TaskName $_.TaskName -TaskPath $_.TaskPath -ErrorAction SilentlyContinue
    if ($info -and $info.LastTaskResult -ne 0 -and $info.LastRunTime -gt $cutoff) {
        [PSCustomObject]@{
            Task       = $_.TaskName
            Path       = $_.TaskPath
            LastRun    = $info.LastRunTime
            Result     = '0x{0:X}' -f $info.LastTaskResult
            NextRun    = $info.NextRunTime
        }
    }
} | Format-Table -AutoSize

Ещё один источник информации — журнал событий планировщика. Там видно всё: запуски, завершения, ошибки:

# Последние 20 событий Task Scheduler
Get-WinEvent -LogName "Microsoft-Windows-TaskScheduler/Operational" -MaxEvents 20 |
    Select-Object TimeCreated, Id, Message |
    Format-Table -Wrap

Работа с задачами на удалённых серверах

Модуль ScheduledTasks умеет работать удалённо через CIM-сессии. Подключаемся к нужной машине и управляем задачами так же, как локально:

# Создать CIM-сессию
$session = New-CimSession -ComputerName "SRV-DC01","SRV-FILE01"

# Получить задачи со всех серверов
Get-ScheduledTask -CimSession $session -TaskPath "\ITfresh\" |
    Select-Object PSComputerName, TaskName, State

# Создать задачу на удалённом сервере
Register-ScheduledTask -CimSession $session `
    -TaskName "Remote-Cleanup" -Action $action -Trigger $trigger

# Закрыть сессию
Remove-CimSession $session
Совет: Для серверов, не поддерживающих WinRM, используйте альтернативный способ: Invoke-Command -ComputerName SRV01 -ScriptBlock { Register-ScheduledTask ... } через PowerShell Remoting.

Практический сценарий: цепочка зависимых задач

Распространённая задача на практике — выстроить цепочку: сначала бэкап, потом очистка старых файлов, потом отправка отчёта. Делается через одну задачу с несколькими действиями:

$actions = @(
    (New-ScheduledTaskAction -Execute "PowerShell.exe" `
        -Argument "-File C:\Scripts\Step1-Backup.ps1"),
    (New-ScheduledTaskAction -Execute "PowerShell.exe" `
        -Argument "-File C:\Scripts\Step2-Cleanup.ps1"),
    (New-ScheduledTaskAction -Execute "PowerShell.exe" `
        -Argument "-File C:\Scripts\Step3-Report.ps1")
)

$trigger = New-ScheduledTaskTrigger -Daily -At "01:00"
$settings = New-ScheduledTaskSettingsSet `
    -StartWhenAvailable `
    -ExecutionTimeLimit (New-TimeSpan -Hours 4)

Register-ScheduledTask -TaskName "Nightly-Pipeline" `
    -TaskPath "\ITfresh\" `
    -Action $actions -Trigger $trigger `
    -Settings $settings -User "SYSTEM" -RunLevel Highest
Внимание: Действия выполняются строго последовательно, но если первый шаг завершится с ошибкой, последующие всё равно запустятся. Для условной логики лучше использовать единый скрипт-оркестратор.

Устранение типичных ошибок

За годы работы с планировщиком через PowerShell набился определённый набор граблей. Вот что встречается чаще всего:

Совет: Для диагностики включите подробное логирование планировщика: откройте eventvwr.msc → Applications and Services Logs → Microsoft → Windows → TaskScheduler → Operational → Enable Log.

Официальная документация: Microsoft Learn — Windows Server, Microsoft Learn — PowerShell

Часто задаваемые вопросы

Что такое Планировщик заданий Windows: создание и управление задачами через PowerShell?

Планировщик заданий Windows: создание и управление задачами через PowerShell — это важный аспект системного администрирования, который позволяет настроить и оптимизировать работу IT-инфраструктуры. В данной статье подробно рассматриваются все ключевые моменты.

Как правильно настроить Планировщик заданий Windows: создание и управление задачами через PowerShell?

Для корректной настройки Планировщик заданий Windows: создание и управление задачами через PowerShell необходимо следовать пошаговой инструкции, представленной в статье выше. Важно учитывать особенности вашей инфраструктуры и требования безопасности.

Какие типичные ошибки возникают при работе с Планировщик заданий Windows: создание и управление задачами через PowerShell?

Наиболее частые ошибки при работе с Планировщик заданий Windows: создание и управление задачами через PowerShell: некорректная конфигурация, недостаточные права доступа и несовместимость версий. Рекомендуем обратиться к специалистам ITFresh для профессиональной настройки.

IT-аутсорсинг для бизнеса

Автоматизация серверной инфраструктуры — наша специальность

Настроим планировщик заданий, мониторинг, резервное копирование и обслуживание ваших Windows-серверов. ООО «АйТи Фреш» берёт на себя всю рутину, чтобы вы сосредоточились на бизнесе.

12+лет на рынке
200+обслуживаемых серверов
24/7поддержка

Комментарии