Главная > Powershell > Обработка ошибок в Powershell

Обработка ошибок в Powershell

В Powershell ошибки делятся на два типа:

  • Критические ошибки – при их возникновении выполнение команды прерывается.
  • Некритические ошибки – при возникновении, команда продолжает выполняться.

В зависимости от ситуации одна и та же ошибка может быть критической, а в другой — некритической.

При возникновении ошибки создаётся специальный объект, в свойствах которого содержится полная информация об ошибке.

Примером некритической ошибки может послужить удаление нескольких файлов, один из которых занят каким-то приложением и не может быть удалён. В этом случае вполне можно продолжить удаление. Но если происходит какая-то логически неделимая операция, то имеет смысл прервать её после возникновения первой ошибки. Такая ошибка будет считаться критической.

При возникновении некритической ошибки информация об ошибке заносится в переменную $error:

типа ErrorRecord:

По умолчанию ошибки выводятся на экран, но можно перенаправить в файл с помощью оператора 2>. Например:

Переменная $error на самом деле является массивом, в котором хранится информация обо всех ошибках, возникших в текущем сеансе работы. По умолчанию длина такого массива 256 (можно посмотреть в переменной $MaximumErrorCount). При заполнении массива полностью объекты “свежих” ошибок будут записываться в самое начало, смещая все остальные, самые старые будут удаляться. Если же нужно отловить (сохранить) конкретную ошибку, её можно перенаправить в переменную с помощью специального оператора 2>$1:

$err = Get-ChildItem NonExistDirecory 2>&1

Для перехвата ошибки без перенаправления в стандартный выходной поток можно использовать стандартный параметр -ErrorVariable, который есть у всех командлетов:

Get-ChildItem NonExistDirecory -ErrorVariable errs

В этом случае ошибка будет перенаправлена в переменную errs. Следует обратить внимание, что в этой конструкции знак $ не нужен, но в дальнейшем при обращении к переменной нужно указывать вместе со знаком, как в обычной переменной.

Кроме того, для определения того, как завершилась предыдущая команда (ошибкой, или нет) в Powershell существует специальная переменная &?. Её значение равно $true, если предыдущая команда завершилась без ошибок и $false, если возникли ошибки.

Режимы обработки ошибок

Кроме параметра -ErrorVariable все командлеты также имеют параметр -ErrorAction, определяющий поведение Powershell при возникновении ошибки.

Возможные варианты:

  • Continue — если обнаружена ошибка, то она будет отображена, а выполнение сценария будет продолжено. (Этот вариант используется по умолчанию.)
  • Inquire — если обнаружена ошибка, то сценарий будет приостановлен, а пользователь должен будет выбрать — продолжить, приостановить или прервать его выполнение.
  • SilentlyContinue — если обнаружена ошибка, то выполнение сценария будет продолжено без ее отображения (но ошибка будет занесена в $error и переменная $? будет установлена в $false).
  • Stop — если обнаружена ошибка, то выполнение сценария будет остановлено.

Можно указать режим обработки ошибки, для каждой возможной ошибки, но если нужно установить один режим для всех ошибок нужно установить переменную $ErrorActionPreference в соответствующее значение. Например:

$ErrorActionPreference = «Inquire»

В этом случае при возникновении каждой ошибки будет выдан зарос, что делать дальше.

Кроме того Powershell иногда считает ошибкой то, что на самом деле ошибкой не является. Например, попытка протестировать доступность компьютера по сети, который в данный момент времени недоступен приведёт к ошибке:

Параметр -count задаёт количество отправляемых запросов (по умолчанию — 4).

Для предотвращения этого в ряде командлетов есть параметр -Quiet, который подавляет все ошибки и возвращает значение $True, если операция завершилась успешно, и значение $False, если все во время выполнения команды возникли ошибки.

Это не всё, что можно сказать про обработку ошибок в Powershell, и в будущем, я возможно продолжу эту тему и расскажу про обработку критических ошибок, про отладку скриптов и возможно что-то ещё :).

Реклама
Рубрики:Powershell Метки:
  1. Алексей
    22/07/2014 в 08:58

    А можно по аналогии с $ErrorActionPreference = «Inquire»
    объявить глобальную переменную для ошибок??!
    а то в каждой строке-команде прописывать $Errorvaraible не комильфо как то(((

    • 22/07/2014 в 12:10

      $ErrorActionPreference это и есть глобальная переменная для ошибок. Просто установите её в нужное значение.

  1. No trackbacks yet.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: