PowerShell ErrorAction — полное руководство

PowerShell по умолчанию выводит ошибку в зависимости от глобальной переменной $ErrorActionPreference. Параметр -ErrorAction позволяет локально переопределить поведение команды при возникновении терминальных ошибок. Доступные значения: Continue, Ignore, Stop, Inquire, SilentlyContinue и Suspend (Suspend работает только в PowerShell Workflow).
Когда использовать -ErrorAction
- При автоматизированных задачах лучше явно задавать поведение ошибок, чтобы избежать непредсказуемых результатов.
- В интерактивных сценариях можно использовать Inquire, чтобы дать пользователю выбор.
- Для надёжных скриптов комбинируйте -ErrorAction Stop с Try/Catch.
Быстрый обзор значений ErrorAction
Continue
Поведение по умолчанию: сообщает об ошибке хосту и продолжает выполнение скрипта.
Пример:
Get-ChildItem C:\nonexistentfolder -ErrorAction Continue
Write-Output "Это сообщение всё равно будет выполнено."Когда использовать: когда ошибка не критична и можно продолжать выполнение.
Ignore
Не сообщает ошибку хосту и продолжает выполнение; ошибка не попадает в массив $Error.
Пример:
Get-ChildItem C:\nonexistentfolder -ErrorAction Ignore
Write-Output "Эта строка выполнится, даже если была ошибка."Когда использовать: редко — только если вы хотите полностью «проглотить» ошибку и не хранить её в $Error.
Stop
Останавливает выполнение команды/скрипта при ошибке. Используется для превращения не-терминальных ошибок в терминальные, чтобы их можно было поймать через Try/Catch.
Пример:
Get-ChildItem C:\nonexistentfolder -ErrorAction Stop
Write-Output "Эта строка НЕ будет выполнена, если произошла ошибка."Когда использовать: в критичных секциях, где дальнейшее выполнение бессмысленно или опасно.

Inquire
При ошибке PowerShell запрашивает у пользователя, какое действие предпринять (в интерактивной сессии).
Get-ChildItem C:\nonexistentfolder -ErrorAction Inquire
Write-Output "Эта строка выполнится только при подтверждении сообщения."Когда использовать: в интерактивных утилитах или когда требуется подтверждение от оператора.

SilentlyContinue
Не выводит ошибку в хост, но добавляет её в массив $Error — полезно, если нужно зарегистрировать ошибку, но не прерывать поток вывода.
Get-ChildItem C:\nonexistentfolder -ErrorAction SilentlyContinue
Write-Output "Эта строка выполнится, даже если произошла ошибка; она будет в $Error."Когда использовать: когда нужно «молчаливо» обработать ошибку позже, например, записать в лог.

Suspend
Работает только в PowerShell Workflow и приостанавливает выполнение для последующего возобновления.
Когда использовать: в workflow-сценариях с долгоживущими задачами и контрольными точками.
Практические шаблоны и альтернативы
- Try/Catch: сочетайте -ErrorAction Stop с конструкцией Try/Catch, чтобы надёжно обрабатывать ошибки.
try {
Get-ChildItem C:\nonexistentfolder -ErrorAction Stop
} catch {
Write-Error "Не удалось получить список: $_"
}- -ErrorVariable: собирает ошибки в указанную переменную для последующего анализа.
Get-ChildItem C:\nonexistentfolder -ErrorAction SilentlyContinue -ErrorVariable myErr
if ($myErr) { Write-Output "Была ошибка: $($myErr[0].Exception.Message)" }- Глобальное изменение: $ErrorActionPreference = ‘Stop’ — влияет на всю сессию; использовать осторожно.
Чит-лист (cheat sheet)
| Параметр | Поведение | Попадает в $Error |
|---|---|---|
| Continue | Сообщить и продолжить | Да |
| Ignore | Не сообщать, продолжить | Нет |
| Stop | Прекращение выполнения | Да |
| Inquire | Запрос у пользователя | Да |
| SilentlyContinue | Не сообщать, но записать | Да |
| Suspend | Приостановить (workflow) | Да |
Ментальные модели и советы
- Ключевой вопрос: критична ли ошибка для дальнейших шагов? Если да — Stop + Try/Catch. Если нет — Continue или SilentlyContinue.
- Для автоматизации выбирайте предсказуемость: явные -ErrorAction и -ErrorVariable лучше, чем полагаться на поведение по умолчанию.
- Inquire применим только при интерактивной работе с пользователем.
Дерево принятия решения
flowchart TD
A[Ошибка возможна?] --> B{Критична ли?}
B -- Да --> C[Использовать -ErrorAction Stop]
B -- Нет --> D{Нужно ли логировать?}
D -- Да --> E[-ErrorAction SilentlyContinue + -ErrorVariable]
D -- Нет --> F[-ErrorAction Ignore/Continue]
C --> G[Обработать в Try/Catch]
E --> H[Анализировать $ErrorVariable]Роли и контрольный список
- Системный администратор:
- Явно задавать -ErrorAction в автомассивах.
- Логировать ошибки через -ErrorVariable или Write-Error.
- Разработчик скриптов:
- Оборачивать критичные вызовы в Try/Catch.
- Не менять $ErrorActionPreference глобально в общих скриптах.
- Инженер автоматизации:
- Использовать -ErrorAction Stop для предсказуемой обработки и уведомлений.
Совместимость и примечания
Важно: старые версии Windows PowerShell и PowerShell Core имеют схожее поведение по ErrorAction, но Suspend поддерживается только в Workflow. Если скрипт будет запускаться в разных окружениях, тестируйте поведение ошибок в целевой версии PowerShell.
Краткое резюме
- -ErrorAction управляет локальным поведением при ошибках; значения: Continue, Ignore, Stop, Inquire, SilentlyContinue, Suspend.
- Для надёжной обработки ошибок используйте -ErrorAction Stop совместно с Try/Catch.
- Для логирования ошибок используйте -ErrorVariable или SilentlyContinue.
Важно: в автоматизированных процессах избегайте молчаливого пропуска ошибок без логирования.
1-строчный глоссарий:
- ErrorActionPreference — глобальная настройка поведения при ошибках.
- Терминирующая ошибка — останавливает выполнение команды.
- $Error — массив последних ошибок в сессии.
- -ErrorVariable — параметр для сохранения ошибок в переменную.
Если у вас остались вопросы или нужно помочь с конкретным сценарием — опишите задачу в комментарии, и мы подскажем подходящую комбинацию -ErrorAction, Try/Catch и логирования.
Похожие материалы
Настройка Outlook для Windows — подробный гид
Преобразовать PNG в PDF на Windows 10/11
Резервное копирование Microsoft 365: как защитить данные
Как скачать видео с Paramount+ для офлайн‑просмотра
Как открыть файл .aspx — инструменты и советы