PowerShell: типы заданий и как их использовать
Быстрые ссылки
- Background Jobs
- Remote Jobs
- WMI Jobs
- Scheduled Jobs
Введение
PowerShell имеет четыре основных типа заданий: Background Jobs, Remote Jobs, WMI Jobs и Scheduled Jobs. В этой статье мы подробно разберём, что это за типы заданий, когда их использовать, какие у них подводные камни и как с ними работать эффективно в реальных сценариях административной автоматизации.

Alt: Скриншот обзорной диаграммы типов заданий PowerShell
Важно: прежде чем применить команды в продакшне, протестируйте их в изолированной среде.
Background Jobs
Определение: фоновое задание запускается асинхронно в той же машине и сессии, где вы его создали. Оно выполняет скриптовый блок независимо от интерактивной оболочки.
Когда использовать: когда команда займёт много времени и вы хотите продолжить работу в текущей консоли.
Пример запуска фонового задания:
Start-Job -Name GetFileList -ScriptBlock { Get-ChildItem C:\ -Recurse }После запуска вы можете продолжать вводить команды — задание выполняется в фоне.

Alt: Окно PowerShell с примером запущенного фонового задания
Просмотр всех заданий:
Get-JobСтатусы заданий указывают на состояние выполнения (Running, Completed, Failed, Stopped и т. п.). Если задание выполняется слишком долго, его можно остановить:
Get-Job -Name GetFileList | Stop-JobВажно: даже если вы остановили задание, результаты, накопившиеся до остановки, остаются доступными. Однако при получении результатов через Receive-Job они по умолчанию удаляются из буфера. Чтобы сохранить результаты, используйте флаг -Keep:
Get-Job -Name GetFileList | Receive-Job -KeepПосле завершения работы с заданием рекомендуется удалить его, чтобы не засорять список:
Get-Job -Name GetFileList | Remove-Job
Alt: Вывод Get-Job с информацией о состоянии фонового задания
Remote Jobs
Определение: удалённые задания выполняют скриптовые блоки на одном или нескольких удалённых компьютерах. Часто используются вместе с WinRM и механизмом PowerShell Remoting.
Запуск удалённого задания в фоне:
Invoke-Command -ComputerName Flash,Viper -Credential administrator -ScriptBlock { Get-ChildItem } -AsJob
Alt: Запуск Invoke-Command с параметром -AsJob на нескольких хостах
Ключевая особенность и подводный камень: при создании удалённого задания PowerShell создаёт один родительский job и по одному дочернему job на каждый целевой компьютер. Get-Job отображает только родительские задания, а его свойство State — «худший» возможный статус: если один из дочерних заданий упал, родительский может показывать Failed.
Чтобы увидеть дочерние задания, используйте:
Get-Job -IncludeChildJob
Alt: Вывод Get-Job с IncludeChildJob, показывающий дочерние задания на каждом хосте
Если вы запрашиваете результаты родительского задания, PowerShell вернёт вывод со всех дочерних заданий. Это удобно, но может привести к смешению удачных и неудачных результатов (включая красные сообщения об ошибках). Два способа предотвратить это:
- Получать результаты по имени хоста:
Get-Job -Id 3 | Receive-Job -Keep -ComputerName Viper- Получать результаты конкретного дочернего задания по его Id:
Get-Job -Id 3 -IncludeChildJob
Get-Job -Id 5 | Receive-Job -Keep
Alt: Получение результатов только с указанного компьютера Viper
Совет: при массовых операциях логируйте stdout и stderr по каждому хосту отдельно — это облегчит диагностику.
WMI Jobs
Определение: WMI Jobs — это удалённые или локальные задания, созданные через Get-WmiObject (или CIM-эквиваленты) с параметром -AsJob. Они похожи на Remote Jobs, но используют WMI как транспорт/объекты.
Пример:
Get-WmiObject -Class Win32_OperatingSystem -ComputerName RemoteHost -AsJob
Alt: Пример запуска Get-WmiObject с -AsJob
Поскольку WMI Jobs используют тот же паттерн родитель–дочерний job, на них распространяются те же gotchas, что и на Remote Jobs: агрегированный статус родительского задания и необходимость фильтрации по хостам или дочерним заданиям при получении результатов.

Alt: Вывод WMI-задания с дочерними заданиями
Scheduled Jobs
Определение: плановое задание — это сохранённый сценарий, который запускается по расписанию и сохраняется между сессиями (persistent). Технически Scheduled Jobs в PowerShell используют Windows Task Scheduler под капотом.
Пример создания планового задания:
Register-ScheduledJob -Name GetEventLogs -ScriptBlock { Get-EventLog -LogName Security -Newest 100 } -Trigger (New-JobTrigger -Daily -At 5pm) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)Разбор команды по шагам:
- -Name GetEventLogs — имя задания.
- -ScriptBlock { … } — что выполнить по срабатыванию.
- -Trigger (New-JobTrigger -Daily -At 5pm) — объект-триггер, создаваемый вложенной командой; в примере — ежедневно в 17:00.
- -ScheduledJobOption (New-ScheduledJobOption -RunElevated) — опции задания (например, запуск с повышенными привилегиями).
Просмотр всех плановых заданий:
Get-ScheduledJob
Alt: Список плановых заданий, возвращаемый Get-ScheduledJob
Примечание: Scheduled Jobs сохраняются в реестре/планировщике задач и доступны между перезапусками PowerShell или системы.
Обычные ошибки и как их избежать
- Статус родительского задания не отражает состояния всех дочерних заданий: всегда проверяйте дочерние задания при масштабных запусках.
- Результаты удаляются при Receive-Job: используйте -Keep, если нужно сохранить результат для последующего анализа.
- Права доступа: многие операции чтения/записи журналов и системных настроек требуют повышенных привилегий — используйте ScheduledJobOption -RunElevated или подходящие учетные данные.
- Ограничения среды: PowerShell Core на кроссплатформенных средах может не поддерживать все возможности Scheduled Jobs; проверяйте совместимость.
Ментальные модели и эвристики
- Модель родитель/дочерний job: думайте о родительском job как о контейнере задач, а о дочерних job как о конкретных исполнениях на целевых хостах.
- Модель «подписался/получил»: Start-Job — вы подписались на выполнение; Receive-Job — забираете результат. Без Receive-Job данные могут либо исчезнуть, либо остаться в буфере в зависимости от флагов.
- Эвристика для масштабируемых операций: при >10 хостах используйте логирование по хостам и фильтрацию результатов по ComputerName или ChildJobId.
Альтернативные подходы
- Runspaces — для высокопроизводительных параллельных задач внутри процесса PowerShell (лучше масштабируются, но сложнее в коде).
- PowerShell Workflows — устаревающий подход (Workflow) с продолжениями и перезапусками; годится для долгоживущих задач, но имеет ограничения.
- Windows Task Scheduler напрямую — если нужна максимально тонкая настройка планировщика, можно зарегистрировать таску вручную или через schtasks.exe.
Когда задания не подходят
- Интерактивные операции, требующие пользовательского ввода, плохо подходят для фоновых/плановых задач.
- Задачи, зависящие от GUI или пользовательской сессии, лучше запускать в интерактивной сессии.
Мини-методология: как выбрать тип задания
- Оцените необходимость в асинхронности. Если нужно ждать — не обязательно использовать job.
- Определите масштаб (локально vs. много хостов). Если массово — используйте Remote Jobs и логирование по хостам.
- Решите жизнеспособность результатов (нужны ли они после перезапуска сессии?). Если да — используйте Scheduled Jobs или сохраняйте вывод в файл/БД.
- Проверьте привилегии и совместимость с PowerShell Core.
Чек-лист при создании задания
- Описание задачи и ожидаемый результат
- Тест в изолированной среде
- Выбран тип задания корректно (Background/Remote/WMI/Scheduled)
- Настроено логирование stdout/stderr по узлу
- Настроены учётные данные и права
- Настроены оповещения при ошибках
- План отката и удаление старых заданий
Командная шпаргалка
- Start-Job -Name
-ScriptBlock { … } - Get-Job [-IncludeChildJob]
- Receive-Job -Id
[-Keep] [-ComputerName ] - Stop-Job -Id
- Remove-Job -Id
- Invoke-Command -ComputerName
- -ScriptBlock { … } -AsJob
- Get-WmiObject -Class
-ComputerName -AsJob - Register-ScheduledJob -Name
-ScriptBlock { … } -Trigger (New-JobTrigger …) -ScheduledJobOption (…) - Get-ScheduledJob
Ролевые чек-листы
Администратор:
- Проверить разрешения для выполнения задач на целевых хостах
- Настроить централизованное логирование и оповещения
Разработчик/автоматизатор:
- Выбрать между Background/Runspace в зависимости от скорости и сложности
- Обеспечить идемпотентность и безопасное логирование
Служба поддержки:
- Инструменты для просмотра статусов заданий (Get-Job, Get-ScheduledJob)
- Пошаговые скрипты для сбора логов при инциденте
План реагирования при проблемах
- Проверить родительский job: Get-Job -Id
- Посмотреть дочерние job: Get-Job -Id
-IncludeChildJob - Получить результаты/ошибки с одного хоста: Receive-Job -Keep -ComputerName
- Если требуется — остановить и удалить проблемный job: Stop-Job | Remove-Job
- Восстановить исходную конфигурацию из резервной копии скриптов/настроек
Безопасность и конфиденциальность
- Права и учётные данные: избегайте хранения паролей в открытом виде. Используйте защищённые хранилища (Credential Manager, секреты).
- Принцип наименьших привилегий: плановые задания, требующие администрирования, должны запускаться с минимально необходимыми правами.
- Логи: не записывайте чувствительные данные (пароли, PII) в открытые журналы.
- GDPR/локальные требования: если задания обрабатывают персональные данные, проверьте, где и как эти данные сохраняются и кто имеет к ним доступ.
Совместимость и переносимость
- PowerShell Core (6/7+) на кроссплатформенных ОС не поддерживает все возможности Scheduled Jobs и некоторые модули, зависящие от Windows API. На Windows рекомендована Windows PowerShell (5.1) для полной совместимости с ScheduledJob API.
- Для WMI на новых системах предпочтительнее использовать CIM-команды (Get-CimInstance) вместо устаревшего Get-WmiObject.
Примеры отказов и когда это не работает
- Ошибка WinRM: если WinRM не настроен на целевых хостах, Invoke-Command -AsJob не выполнится.
- Ошибки прав: попытки читать защищённые журналы без прав приведут к Failed в дочернем job.
- Ограничения сети: пакетный запуск на сотнях хостов может вызвать сетевую перегрузку или превышение квот.
Диаграмма выбора типа задания
flowchart TD
A[Нужно выполнять асинхронно?] -->|Да| B{Требуется запуск на удалённых хостах?}
A -->|Нет| Z[Обычный синхронный скрипт]
B -->|Да| C[Invoke-Command -AsJob 'Remote Jobs']
B -->|Нет| D[Start-Job 'Background Jobs' или Runspaces]
C --> E{Требуется WMI данные?}
E -->|Да| F[Get-WmiObject -AsJob / Get-CimInstance]
E -->|Нет| G[Обычный Remote Job]
D --> H{Нужно сохранять между сессиями?}
H -->|Да| I[Register-ScheduledJob]
H -->|Нет| DФакто-бокс
- Четыре типа заданий: Background, Remote, WMI, Scheduled.
- Родительский job агрегирует состояние дочерних jobs.
- Receive-Job по умолчанию удаляет результат, используйте -Keep для сохранения.
Короткое резюме
- Используйте Background Jobs для локальной асинхронности.
- Для удалённого выполнения на нескольких хостах применяйте Invoke-Command -AsJob и отслеживайте дочерние задания.
- WMI Jobs аналогичны Remote Jobs, но работают через WMI/CIM.
- Scheduled Jobs — это постоянные задания, которые запускаются по расписанию и сохраняются между сессиями.
Важно: всегда тестируйте и логируйте результаты по каждому хосту для упрощения диагностики.
Заключение
Знание типов заданий PowerShell даёт гибкость и надёжность при автоматизации задач: от быстрого фонового поиска файлов до регулярного сбора логов на сотнях серверов. Выберите подходящий тип задания, настройте логирование и права доступа, и ваши автоматизирующие скрипты будут устойчивы и удобны в эксплуатации.
Важные команды в примерах
- Start-Job
- Get-Job
- Receive-Job
- Stop-Job
- Remove-Job
- Invoke-Command -AsJob
- Get-WmiObject -AsJob
- Register-ScheduledJob
- Get-ScheduledJob
Конец статьи.
Похожие материалы
Снизить нагрузку CPU во время игр
Почему ноутбук тормозит при зарядке — как исправить
Восстановление фото из превью Lightroom
F.lux — автоматическая подстройка цвета экрана
Ошибка регистрации Kindle — как исправить