Обрабатывайте ошибки PowerShell как босс с помощью этих советов

При первом запуске сценариев в PowerShell может возникнуть соблазн собрать пакет команд

, Однако, если ваш скрипт завершится неудачно, вы не будете знать, с чего начать устранение неполадок. Чтобы уберечь себя от лишних затрат времени, пытаясь угадать, почему ваш скрипт не удался, вы должны использовать обработку ошибок.

Обработка ошибок PowerShell состоит из четырех частей: параметр Error Action, блоки Try / Catch, параметр Error Variable и ведение журнала.

Простой способ обработки ошибок PowerShell

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

Советы по обработке ошибок powershell

С другой стороны, не всегда понятно, когда данный командлет выдает завершающую ошибку. Некоторые командлеты возвращают ошибку, но не останавливают ваш скрипт. После этого вы можете дождаться завершения сценария, пока он выводит бессмыслицу.

Это где -ErrorAction Параметр входит. Вы используете это, чтобы заставить командлет обрабатывать ошибку так, как вы хотите. Если вы модифицируете существующий скрипт

, вы добавляете его в конец строки командлета.

Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Stop

Очевидно, что если вы используете Get-ChildItem Командлет сам по себе, ошибка не так много для вас. Однако, если вы хотите что-то сделать с данными, было бы хорошо остановить сценарий, чтобы вы знали, что поиск не удался и почему. В качестве альтернативы, если вы делаете несколько поисков, измените параметр с Стоп в SilentlyContinue, поэтому сценарий продолжается, если поиск не удался. Если вы хотите увидеть, что это за ошибка, вы можете использовать Продолжить в качестве параметра вместо.

Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction SilentlyContinue

Если вы предпочитаете контролировать то, что происходит при каждом запуске скрипта, вы можете изменить его на спрашивать. Когда ваш командлет попадает в зацепку, он предоставляет следующие параметры: Да, да для всех, остановить команду, приостановить или помочь.

Советы по обработке ошибок powershell

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

Обработка ошибок способом программирования

ErrorAction Параметр решает ваши ошибки несложным способом. Тем не менее, если вы ищете немного больше контроля над ошибками, PowerShell все равно покроет вас. С помощью Попробуй поймать, Теперь мы можем разветвлять скрипт, когда командлеты возвращают ошибку.

Советы по обработке ошибок powershell

Как следует из названия, Попробуй поймать состоит из двух частей. (Технически существует третий, но мы вернемся к этому через минуту.) Первый Пытаться раздел. Вы собираетесь запустить свой обычный код в этом разделе. Вы все еще собираетесь использовать -ErrorAction параметр, но его можно установить только как Стоп. Этот флаг гарантирует, что ваш командлет вызывает Ловить-даже если у него нет завершающей ошибки.

Try{
Get-Process "Cortana" -ErrorAction Stop
}

Попытка может также предотвратить запуск других командлетов в случае сбоя поиска. В этом случае, если вы отправляете Get-Process результаты к Stop-Process, неудачный поиск не позволяет запустить второй командлет.

Итак, теперь, когда вы создали блок командлетов try, что вы хотите делать в случае сбоя? С использованием Ловить половина, вы собираетесь определить это.

Catch{
Write-Host "Process Not Found"
}

Как с ErrorAction параметр, когда вы делаете что-то более сложное

Ловить будет полезен не только для простого отказа от языка. (В приведенном выше примере сбой вызван использованием имени приложения, а не имени процесса.) Поэтому убедитесь, что вы играете с Пытаться блок, чтобы создать поиск / действие, которое вам нужно. Вы можете использовать Ловить заблокировать ваш скрипт, чтобы он отправлял вам электронное письмо в случае неудачи

Третья часть пригодится, если вы хотите, чтобы что-то выполнялось независимо от того, успешно ли выполняется ваш командлет или нет. Для этого вы можете использовать в заключение блок. Вы добавляете это после Try and Catch и регистрируетесь, когда раздел вашего скрипта заканчивается.

Переменная ошибки и ведение журнала

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

, Тем не менее, как вы можете исследовать сбой сценария? С -ErrorVariable Параметр ошибок вашего командлета записать в пользовательскую переменную. Это альтернатива системе $ Ошибка переменная, которая содержит все ошибки текущего сеанса.

Советы по обработке ошибок powershell

Ваш командлет должен стать немного длиннее. Сначала определите переменную, что-то вроде $ SearchError сделаю для примера. Когда вы звоните SearchError в ErrorVariable parmeter, вы не используете знак доллара. Даже если вы вызываете созданную вами переменную, из-за того, как работает параметр, вы вызываете его без знака доллара. Затем добавьте это в конец строки.

Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Continue -ErrorVariable SearchError

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

Советы по обработке ошибок powershell

Чтобы это работало, создайте текстовый файл сразу после установки переменной error. Сделайте это с New-Item Командлет. Вы можете использовать спрашивать вариант для ErrorAction параметр. Это позволяет вам добавить в существующий журнал, когда New-Item Сбой в командлете.

$SearchLog = New-Item "~\SearchLog.txt" -type file -ErrorAction Inquire

Теперь, когда вы строите свой Попробуй поймать блок, вы можете использовать Ловить войти в текстовый файл. Ты используешь Get-Date создать метку времени. Форматирование может быть сложным, поэтому обязательно скопируйте его из примера.

Try{
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Stop -ErrorVariable SearchError
}
Catch{
Add-Content -Path $SearchLog -Value "$(Get-Date -Format dd-MM-yy-hh_mm_ss) Files not found returned error: $SearchError"
}

Повторите это по мере необходимости для всех ваших командлетов

, и теперь у вас есть хороший журнал любых ошибок. Если вы хотите отслеживать вещи, которые работают успешно, вы можете добавить аналогичный Добавить контент в конце Пытаться блок. Эта запись ведется только тогда, когда ваш Пытаться Командлет успешно. Затем вы можете регистрировать свои ошибки и успехи с отметками времени. Регистрация теперь позволяет вам знать все, что ваш сценарий сделал, успех или неудача.

Сила кода

Использование PowerShell в командной строке

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

Есть ли время, когда обработка ошибок спасла ваш бекон? Есть ли у вас сценарий PowerShell, который мог бы улучшить обработку ошибок? Какой у вас следующий проект PowerShell? Дайте нам знать об этом в комментариях.

Ссылка на основную публикацию
Adblock
detector