TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #2430 2.39K
День 2007. #ЗаметкиНаПолях
Остановка PowerShell Скрипта при Ошибке
По умолчанию PowerShell не останавливает скрипт при возникновении ошибки. Вместо этого он записывает ошибку в поток ошибок и продолжает выполнение скрипта. Вы можете изменить это поведение, установив переменную $ErrorActionPreference в значение Stop. Тогда PowerShell остановит скрипт при возникновении ошибки.

PowerShell имеет два разных вида команд: командлеты (cmdlet) и нативные команды. Например, Get-ChildItem — это командлет, а git — нативная команда. Начиная с первой версии PowerShell, переменная $ErrorActionPreference управляла поведением только командлетов. В PowerShell 7.3 была введена переменная $PSNativeCommandUseErrorActionPreference для управления поведением нативных команд.

Если задать $ErrorActionPreference значение Stop, PowerShell остановит скрипт, когда командлет выдаст ошибку. Если задать $PSNativeCommandUseErrorActionPreference в значение true, PowerShell также остановит скрипт, когда нативная команда выдаст ошибку. Хорошей практикой будет установить обе переменные в начале скрипта:
# Остановить скрипт при ошибке
$ErrorActionPreference = 'Stop'
$PSNativeCommandUseErrorActionPreference = $true

Можно переопределить поведение $ErrorActionPreference для каждого командлета, используя параметр -ErrorAction. Например, следующая команда не останавливает скрипт, если Get-ChildItem завершится с ошибкой:
Get-ChildItem dummy -ErrorAction SilentlyContinue

Чтобы обойти поведение $PSNativeCommandUseErrorActionPreference для определённой нативной команды, вы можете использовать синтаксис & { } для запуска команды внутри блока скрипта. Внутри блока скрипта вы можете изменить значение $PSNativeCommandUseErrorActionPreference на false. Когда блок скрипта завершается, переменная возвращается к своему предыдущему значению.
& {
# Изменяем $PSNativeCommandUseErrorActionPreference в этом блоке
$PSNativeCommandUseErrorActionPreference = $false
robocopy.exe dummy1 dummy2
if ($LASTEXITCODE -gt 8) {
throw "robocopy failed with exit code $LASTEXITCODE"
}
}

Источник: https://www.meziantou.net/stop-the-script-when-an-error-occurs-in-powershell.htm
  • 👍 17
More from @netdeveloperdiary
  1. Oct 7, 2026День 2807. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Окончание Нач…
  2. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  3. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
  4. Oct 5, 2026День 2805. #ЧтоНовенького #NET11 Аргументы в Выражениях Коллекций в C#15 В C#15 реализован…
  5. Oct 4, 2026День 2804. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
  6. Oct 3, 2026Post #3360
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →