PowerShell делит ошибки на два типа. Звучит просто, но именно непонимание этого различия ломает скрипты чаще всего.
Terminating errors (завершающие) — полностью останавливают выполнение команды или скрипта. Деление на ноль, вызов несуществующего метода, исключения .NET — всё это сюда. Перехватываются блоком try/catch.
Non-terminating errors (незавершающие) — скрипт выводит ошибку и спокойно идёт дальше. Типичные примеры: файл не найден в Get-Item, нет доступа к одному из файлов в списке. По умолчанию try/catch их не видит вообще.
Вот откуда берётся классическая головная боль: администратор честно обернул всё в try/catch, но ошибки всё равно проскакивают мимо — потому что они non-terminating.
# Эта ошибка НЕ будет перехвачена!
try {
Get-Item 'C:\nonexistent.txt' # Non-terminating error
} catch {
Write-Host 'Ошибка перехвачена' # Никогда не выполнится
}Лечится это одним параметром — -ErrorAction Stop. Он буквально конвертирует non-terminating ошибки в terminating:
# Теперь ошибка будет перехвачена
try {
Get-Item 'C:\nonexistent.txt' -ErrorAction Stop
} catch {
Write-Host "Перехвачено: $($_.Exception.Message)"
}
Оставить комментарий