Гид по технологиям

PowerShell: типы заданий и как их использовать

8 min read PowerShell Обновлено 15 Dec 2025
PowerShell: фоновые, удалённые, WMI и плановые задания
PowerShell: фоновые, удалённые, WMI и плановые задания

Быстрые ссылки

  • Background Jobs
  • Remote Jobs
  • WMI Jobs
  • Scheduled Jobs

Введение

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

/wordpress/wp-content/uploads/gg/up/sshot5150b3c58b51f.png

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

/files/d0e86c29-c404-49d7-8b4d-e8f6612e0c97.png

Alt: Вывод Get-Job с информацией о состоянии фонового задания

Remote Jobs

Определение: удалённые задания выполняют скриптовые блоки на одном или нескольких удалённых компьютерах. Часто используются вместе с WinRM и механизмом PowerShell Remoting.

Запуск удалённого задания в фоне:

Invoke-Command -ComputerName Flash,Viper -Credential administrator -ScriptBlock { Get-ChildItem } -AsJob

/files/f64392da-0728-4b53-b587-000bd5f802fb.png

Alt: Запуск Invoke-Command с параметром -AsJob на нескольких хостах

Ключевая особенность и подводный камень: при создании удалённого задания PowerShell создаёт один родительский job и по одному дочернему job на каждый целевой компьютер. Get-Job отображает только родительские задания, а его свойство State — «худший» возможный статус: если один из дочерних заданий упал, родительский может показывать Failed.

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

Get-Job -IncludeChildJob

/files/9ceca0fa-6882-4a3e-b8ed-f99d270a7e40.png

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

/files/bb5cc0b4-9b37-43ae-93ef-9295cfe2fa10.png

Alt: Получение результатов только с указанного компьютера Viper

Совет: при массовых операциях логируйте stdout и stderr по каждому хосту отдельно — это облегчит диагностику.

WMI Jobs

Определение: WMI Jobs — это удалённые или локальные задания, созданные через Get-WmiObject (или CIM-эквиваленты) с параметром -AsJob. Они похожи на Remote Jobs, но используют WMI как транспорт/объекты.

Пример:

Get-WmiObject -Class Win32_OperatingSystem -ComputerName RemoteHost -AsJob

/files/e27ad857-0469-4557-9636-f15a0ab74523.png

Alt: Пример запуска Get-WmiObject с -AsJob

Поскольку WMI Jobs используют тот же паттерн родитель–дочерний job, на них распространяются те же gotchas, что и на Remote Jobs: агрегированный статус родительского задания и необходимость фильтрации по хостам или дочерним заданиям при получении результатов.

/files/a20fec50-243e-44bc-8feb-51873ac1d238.png

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

/files/29c5a2e4-c4f3-4f40-9cef-395a914446c5.png

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 или пользовательской сессии, лучше запускать в интерактивной сессии.

Мини-методология: как выбрать тип задания

  1. Оцените необходимость в асинхронности. Если нужно ждать — не обязательно использовать job.
  2. Определите масштаб (локально vs. много хостов). Если массово — используйте Remote Jobs и логирование по хостам.
  3. Решите жизнеспособность результатов (нужны ли они после перезапуска сессии?). Если да — используйте Scheduled Jobs или сохраняйте вывод в файл/БД.
  4. Проверьте привилегии и совместимость с 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)
  • Пошаговые скрипты для сбора логов при инциденте

План реагирования при проблемах

  1. Проверить родительский job: Get-Job -Id
  2. Посмотреть дочерние job: Get-Job -Id -IncludeChildJob
  3. Получить результаты/ошибки с одного хоста: Receive-Job -Keep -ComputerName
  4. Если требуется — остановить и удалить проблемный job: Stop-Job | Remove-Job
  5. Восстановить исходную конфигурацию из резервной копии скриптов/настроек

Безопасность и конфиденциальность

  • Права и учётные данные: избегайте хранения паролей в открытом виде. Используйте защищённые хранилища (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

Конец статьи.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Снизить нагрузку CPU во время игр
Технологии

Снизить нагрузку CPU во время игр

Почему ноутбук тормозит при зарядке — как исправить
Техподдержка

Почему ноутбук тормозит при зарядке — как исправить

Восстановление фото из превью Lightroom
Фото

Восстановление фото из превью Lightroom

F.lux — автоматическая подстройка цвета экрана
Утилиты

F.lux — автоматическая подстройка цвета экрана

Ошибка регистрации Kindle — как исправить
Руководства

Ошибка регистрации Kindle — как исправить

Как добавить линию тренда в Google Sheets
Google Sheets

Как добавить линию тренда в Google Sheets