Триггеры — расписание и наблюдатели
Два типа фоновых скриптов
| Тип | Как работает | Примеры задач |
|---|---|---|
| Запланированный (scheduled) | Стартует по календарю, завершается | Бэкап ночью, отчёт раз в неделю, очистка temp |
| Наблюдатель (watcher) | Работает постоянно или опрашивает часто | Новый файл в папке, порог диска, очередь сообщений |
Оба типа — триггеры из модели автоматизации. Код действий один и тот же; меняется только способ запуска.
.ps1 должен отрабатывать вручную с -NoProfile -File и возвращать exit 0 / exit 1. Планировщик лишь повторяет то, что уже проверено человеком.Три вопроса перед настройкой триггера
1. Зависимости
- Какие модули нужны (
Import-Moduleв начале скрипта)? - Установлены ли они для той УЗ, от которой пойдёт задача (системная vs пользовательская)?
- Нужны ли разные версии одного модуля для двух скриптов на одном хосте?
Install-Module внутри рабочего скрипта не используют — установка при подготовке сервера или образа.
2. Место выполнения
| Ошибка | Последствие |
|---|---|
| Скрипт Azure AD на машине без сети | Таймаут, ложный алерт |
| Создание пользователя AD на одном DC, почта Exchange на другом — без репликации | «Пользователь не найден» |
| Задача, требующая локального WMI/CIM, запущена удалённо | Пустой или неверный результат |
Скрипт запускают там, где есть данные и права, а не «где удобнее».
3. Контекст (учётная запись)
| Контекст | Когда |
|---|---|
| Пользователь (доменная УЗ в планировщике) | AD, SQL с SQL-auth, сетевые шары под пользователем |
| SYSTEM / LocalService | Локальные службы, реестр машины, до входа пользователя |
| УЗ службы (gMSA / dedicated) | Продакшен-автоматизация с минимальными правами |
Модули, установленные только в профиль пользователя, недоступны задаче, стартующей от SYSTEM — ставьте -Scope AllUsers или AllUsers для Windows.
Запланированный скрипт в Windows
Полный пример Register-ScheduledTask — в 2.05/112. Краткая схема:
$action = New-ScheduledTaskAction `
-Execute 'pwsh.exe' `
-Argument '-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\Archive-Logs.ps1"' `
-WorkingDirectory 'C:\Scripts'
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Sunday -At '02:00'
Register-ScheduledTask -TaskName 'Archive-Logs' -Action $action -Trigger $trigger
| Параметр запуска | Зачем |
|---|---|
-NoProfile | Без личных алиасов и медленного профиля |
-ExecutionPolicy Bypass | Только для этой сессии; не меняет политику машины |
-WorkingDirectory | Относительные пути и логи рядом со скриптом |
-StartWhenAvailable | Догнать пропуск, если сервер был выключен |
Linux / macOS — cron или systemd timer с pwsh:
0 2 * * 0 /usr/bin/pwsh -NoProfile -File /opt/scripts/archive-logs.ps1 >> /var/log/archive-logs.log 2>&1
Подробнее про cron и systemd — скрипты Unix.
CI (Jenkins, GitHub Actions) — ещё один вид расписания: pipeline по cron или webhook; см. DevOps.
Скрипт-наблюдатель и исполнитель
Надёжный паттерн из практики автоматизации — разделение ролей:
Наблюдатель (лёгкий, долгоживущий)
→ обнаружил событие
→ запускает Исполнитель (тяжёлый .ps1 с param)
→ ждёт exit code / таймаут
Исполнитель (Process-Inbound.ps1) — обычный скрипт с param, try/catch, exit.
Наблюдатель — минимальная логика ожидания:
# Watch-Inbound.ps1 — упрощённый опрос (без FileSystemWatcher)
$folder = 'C:\Inbound'
$stateFile = "$PSScriptRoot\.last-scan"
$executor = Join-Path $PSScriptRoot 'Process-Inbound.ps1'
while ($true) {
$known = if (Test-Path $stateFile) { Get-Content $stateFile } else { @() }
$current = Get-ChildItem -LiteralPath $folder -Filter '*.csv' | Select-Object -ExpandProperty Name
$new = Compare-Object -ReferenceObject $known -DifferenceObject $current |
Where-Object SideIndicator -eq '=>' |
Select-Object -ExpandProperty InputObject
foreach ($name in $new) {
$full = Join-Path $folder $name
& pwsh -NoProfile -File $executor -Path $full
if ($LASTEXITCODE -ne 0) {
Write-Warning "Исполнитель завершился с кодом $LASTEXITCODE для $name"
}
}
$current | Set-Content $stateFile
Start-Sleep -Seconds 60
}
FileSystemWatcher (реакция без минутного опроса) — пример в 2.05/112.
Корректное завершение наблюдателя
- Обрабатывайте Ctrl+C и остановку службы: trap или
Register-EngineEvent -SourceIdentifier PowerShell.Exiting. - Не запускайте второй исполнитель, пока первый не завершился (флаг
$busyили очередь). - Логируйте каждый запуск исполнителя с меткой времени.
Сравнение способов запуска
| Способ | Платформа | Плюсы | Минусы |
|---|---|---|---|
| Планировщик Windows | Windows | Встроен, GUI, Register-ScheduledTask | Контекст УЗ, нет sub-minute cron |
| cron / systemd | Linux | Просто, привычно админам | Нужен установленный pwsh |
| FileSystemWatcher | Windows (.NET) | Быстрая реакция на файл | Долгоживущий процесс, отладка сложнее |
| Опрос в цикле | Любая | Простой код | Задержка, лишний CPU |
| Jenkins / GHA | Сервер CI | История, артефакты, секреты CI | Инфраструктура |
Чек-лист триггера
| # | Вопрос |
|---|---|
| 1 | Скрипт проходит ручной запуск с теми же аргументами, что у планировщика? |
| 2 | Модули установлены для УЗ задачи? |
| 3 | Пути абсолютные или $PSScriptRoot? |
| 4 | Есть журнал и exit 1 при ошибке? |
| 5 | Для watcher — что при двойном срабатывании и при падении исполнителя? |
| 6 | Секреты берутся из хранилища, а не из .ps1? — 111 |
Дальше
| Тема | Материал |
|---|---|
| Remoting, массовый запуск | 2.05/112 |
| Секреты, SecretManagement | 127 |
| Конфигурация JSON | 128 |
| Тесты перед продакшеном | 111 — Pester, 112 — Pester |
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). История PowerShell - эволюция платформы от Windows-оболочки до кроссплатформенного языка автоматизации. Простые приложения на PowerShell — скрипты Windows, файлы, JSON и REST. Экосистема автоматизации на PowerShell - установка, окружение и типовые инструменты для системных задач. Набор советов, правил, принципов и обычаев в разработке на этом языке. Основы языка PowerShell - синтаксис, объектный пайплайн и базовые подходы к автоматизации администрирования. PowerShell представляет собой среду командной строки и скриптовый язык, построенный на базе платформы .NET. $this — переменная, указывающая на текущий объект в методах классов. В PowerShell переменная $this используется внутри методов для обращения к свойствам и методам текущего экземпляра класса. Командлеты и встроенные функции PowerShell - устройство, принципы использования и расширение возможностей оболочки. Типизация, набор правил определения типа данных значений языка. Условные выражения и циклы в PowerShell - ветвление сценариев и управление повторяющимися операциями. Функции и продвинутые параметры в PowerShell - переиспользование кода, валидация аргументов и удобство CLI. Для динамического добавления свойств используется cmdlet Add-Member. Это позволяет расширять функциональность объектов без изменения их исходного кода.История PowerShell
Простые приложения на PowerShell
Экосистема автоматизации на PowerShell
Рекомендации по написанию PowerShell-скриптов
Основы языка PowerShell
Синтаксис и операторы PowerShell
Ключевые слова и управляющие конструкции
Командлеты и встроенные функции PowerShell
Типы данных и работа с переменными
Условные выражения и циклы
Функции и продвинутые параметры
Объектная модель и конвейерная обработка