Как да използвате PowerShell Опитайте Catch Finally за обработка на грешки
PowerShell Опитай да хванеш блокът се използва за обработка на грешки в скриптовете на PowerShell. Когато използвате PowerShell Опитай да хванеш блок за скриптове, можете да постигнете следното:
- Накарайте вашия скрипт да продължи да работи въпреки грешка
- Показвайте и обработвайте по-добре съобщенията за грешки
В това ръководство ще научите как да използвате Powershell Опитай да хванеш блокове за обработка на прекратяващи съобщения за грешки в PowerShell. Освен това ще научите как да включите Най-накрая блок в а Опитай да хванеш блок.
Ръководството започва със синтаксиса на Опитай да хванеш блок.
Разгледайте темите на публикациите
- PowerShell Опитайте Catch синтаксис
- Често срещани типове грешки при изключения в PowerShell Опитайте Catch
- Как да улавяте конкретни изключения с PowerShell Опитайте Catch
- Как да включите окончателен блок към PowerShell Try Catch изявление
- Допълнителна полезна информация за PowerShell Опитайте Catch
- Как да изчистите PowerShell Опитайте Catch $Error Автоматична променлива
- Как да покажете персонализирано съобщение за грешка в PowerShell Опитайте Catch Block
- Как да получите информация за категорията за грешка в PowerShell Опитайте Catch
- Как да използвате Write-Host за показване на съобщения за грешки в PowerShell Опитайте Catch
- Как да създадете Hashtable в PowerShell Опитайте Catch Block
- PowerShell Опитайте Catch Примери
- Как да използвате PowerShell Опитайте Catch с Get-Childitem
- Как да използвате PowerShell Опитайте Catch за експортиране на Get-WMIObject грешки с Export-csv
- Как да хванете грешки в Get-Process с PowerShell Опитайте Catch Statement
- Как да хванете грешки в Get-Mailbox с PowerShell Опитайте Catch Statement
- Препратки и допълнителна литература
PowerShell Опитай да хванеш Синтаксис
Синтаксисът на PowerShell Опитай да хванеш е…
|_+_|
В Опитвам е частта от блока, която искате PowerShell да следи за грешки. Това е блокът с оригиналните скриптове, който може да върне грешка при прекратяване.
Когато възникне грешка в блока Try, PowerShell записва грешката в автоматичната променлива $Error (повече за това по-късно).
От друга страна, т той улов изявление на PowerShell Опитай да хванеш block обработва грешките, генерирани в блока try. Можете също да посочите видовете грешки, които се обработват в рамките на Хвани блок изявление.
В Най-накрая блок може да се използва за освобождаване на всички ресурси, които вече не са необходими на скрипта.
Често срещани типове грешки при изключения в PowerShell Опитай да хванеш
Можете да обработвате различни типове грешки в блок PowerShell Try Catch. Например, можете да обработвате конкретни грешки.
Освен това можете да обработвате общи съобщения за грешки. Въпреки това, за да се справите с конкретни типове грешки, трябва да знаете вида на грешката.
по-късно в това ръководство ще научите, че съобщенията за грешки се записват в автоматичната променлива $error. Освен това грешките могат също да бъдат записани в променливата на конвейера $_.
Освен това грешките, записани в автоматичната променлива $error, се записват в масив. За да обясним това, нека изпълним команда, която връща прекратяващо съобщение за грешка:
За да изчистите всички грешки, записани преди това в $error автоматична променлива, преди да изпълните командата по-долу, първо стартирайте $error.Clear() команда. |_+_| Няма регистър на събитията, наречен Systerr, така че командата в блока Try ще изведе съобщение за грешка.Изненадващо, командата не показва никакво съобщение за грешка. И така, какво се случи със съобщението за грешка?
Записва се в автоматичната променлива $error! За да покажете грешката от последната команда, записана в променливата $error, изпълнете командата...
|_+_|Резултатът от командата показва подробностите за грешката, записани в автоматичната променлива $error. Информацията за грешката има раздел, наречен FullyQualifiedErrorId .
За тази конкретна грешка, FullyQualifiedErrorId има два набора информация - System.InvalidOperationException и Microsoft.PowerShell.Commands.GetEventLogCommand .
Информацията, която ни интересува е System.InvalidOperationException . Това е вид грешка, която можете улов в блока PowerShell Try Catch.
За да получите името на това изключение на PowerShell, изпълнете командата по-долу:
|_+_|Ето го, System.InvalidOperationException !
В следващите няколко подраздела ще обсъдя често срещаните грешки при PowerShell Try Catch Exception.
PowerShell Опитайте Catch CommandNotFoundException Грешка
Ако изпълните команда, която не съществува в PowerShell или Microsoft Command Prompt, ще получите съобщение за грешка. Например, ако стартирате Get-File команда, ще получите съобщение за грешка, тъй като тази команда не е валиден командлет на PowerShell.
Ето екранна снимка на резултата от командата в PowerShell...
Както можете да видите от екранната снимка, типът на изключението (FullyQualifiedErrorId) е CommandNotFoundException .
грешка при инсталиране на помощника на ares
Тъй като това е грешка при прекратяване, това ще спре вашия скрипт да продължи. За да спрете тази грешка да прекрати вашия скрипт, увийте командата в a Опитай да хванеш блок.
Ако увием тази грешка в блок PowerShell Try Catch, PowerShell ще потисне грешката. Освен това ще спре да прекрати вашия скрипт.
Въпреки това, въпреки че грешката е потисната, тя се записва в променливата $error. Както обикновено, преди да изпълните командата по-долу, първо изчистете грешките, записани в променливата $error.
|_+_|Ако искате да изпълните командата в PowerShell вместо в PowerShell ISE, въведете командите в един ред, както е показано по-долу:
|_+_|След това, за да се покаже грешката, стартирайте...
|_+_|
Както споменах в основното въведение в този раздел, за да покажете идентификатора на изключението за тази грешка, изпълнете командата по-долу:
|_+_|Пълното име на изключението е System.Management.Automation.CommandNotFoundException .
PowerShell Опитайте Catch ManagementObjectNotFoundException Грешка
Когато изпълните команда в отдалечена PS сесия с грешна информация, PowerShell връща a ManagementObjectNotFoundException грешка.
Типичен сценарий е, когато се свържете с Office 365 с PowerShell. След това изпълнете командата Get-User, но въведете грешен потребител самоличност .
За да хванете тази грешка с PowerShell Try Catch, използвайте команда, подобна на тази по-долу:
|_+_| Хващане на ManagementObjectNotFoundException грешка с PowerShell Опитайте, Catch е особено труден. Трябва да използвате ErrorAction параметър и посочете Спри се . В противен случай, дори и с Try, Catch, грешката пак ще се показва.И накрая, за да получите името на изключението, използвайте командата по-долу:
|_+_|Командата връща типа на изключението като System.Management.Automation.RemoteException . И така, какво е ManagementObjectNotFoundException ?
ManagementObjectNotFoundException е причината за изключението, както се потвърждава от командата по-долу:
|_+_|
PowerShell Опитайте Catch Изключение на UnauthorizedAccessException Грешка
Друга често срещана грешка при изключение на PowerShell е Изключение на UnauthorizedAccessException . Този тип грешка се извежда, когато се опитате да получите достъп до елемент, за който нямате поне разрешение за четене.
За да илюстрирам този пример, отказах на удостоверени потребители достъп до конкретен файл на моя компютър.
Сега, ако се опитам да осъществя достъп до файла с командата Get-Content, получавам съобщение за отказан достъп.
|_+_|
За да спрете показването на тази грешка, изпълнете командата в блока PowerShell Try Catch, както е показано по-долу...
|_+_|За съжаление, командата по-горе не спира показването на грешката. Причината е, че това не е грешка при прекратяване.
За да спрете показването на грешката, включете ErrorAction параметър и посочете Спри се .
|_+_|Сега командата потиска грешката. За да покажете вида на изключението, изпълнете командата по-долу...
|_+_|Видът на изключението е System.UnauthorizedAccessException .
Има повече видове грешки при изключения от това, което е обхванато в този раздел. Обхванах само най-често срещаните видове изключения.Как да улавяте конкретни изключения с PowerShell Опитайте Catch
Последният раздел обсъди често срещаните изключения на PowerShell и как да намерите типа на изключението. Този раздел ще обхване как да използвате тази информация за улавяне на специфични типове съобщения за грешки.
В раздела за синтаксис на това ръководство казах, че общият синтаксис на PowerShell Try Catch Finally е...
|_+_|В блока catch на синтаксиса можете да видите [тип грешка]. Тук можете да посочите типа грешка, която искате да хванете в този блок.
Например, за да хванете UnauthorizedAccessException грешки, използвайте изявленията по-долу...
|_+_|За да изпълните командата в PowerShell, посочете изразите в един ред. Първата част на оператора – $error.Clear() – изчиства всички грешки, записани в променливата $error.
|_+_|Как да добавите няколко Хвани Блокове в PowerShell Опитай да хванеш Изявление
Във въведението на този раздел ви показах как да хванете конкретен тип изключение в Хвани блок. Можете да посочите няколко
Ето един пример…
|_+_|В този пример, първият улов блок обработва посочените типове изключения. Освен това, вторият улов блок манипулатори обработва общи грешки.
Как да извлечете изключение за грешка с PowerShell Опитайте Catch
Последният подраздел обхвана как да посочите множество блокове за хващане за обработка на различни видове изключения. В този подраздел ще научите как да извлечете подробностите за грешката в изключение.
За да илюстрирам това, ще използвам пример, който използвах по-рано. Изпълнете този израз на PowerShell в PowerShell.
|_+_|Сега стартирайте $error самостоятелно...
|_+_|Въпреки че множество информация е запазена в променливата $error, действителното съобщение за грешка е подчертано на екранната снимка по-долу.
Ако искате да регистрирате тази грешка в текстов файл, трябва да регистрирате само действителните подробности за грешката. За да извлечете тази грешка, използвайте командата по-долу:
|_+_|Командата извлича действителното съобщение за грешка. Достъпът до пътя „D:PS-Tutorialfolder-names.txt“ е отказан.
Можете да запишете това съобщение за грешка в регистрационен файл, като включите a Извън файл команда в блока Catch.
създаване на afk канал в раздор|_+_| Включих Добавяне параметър в Извън файл команда, за да позволи регистриране на множество записи, без да се презаписват предишните записи.
За да улесня разбирането на последната команда, ще я пренапиша във формата на скрипта по-долу...
|_+_|Как да включите А Най-накрая Блокиране към PowerShell Опитай да хванеш Изявление
Можете да включите a Най-накрая блокирайте към PowerShell Опитай да хванеш Изявление. Синтаксисът е
|_+_|В накрая блок може да се използва за освобождаване на всички ресурси, които вече не са необходими на скрипта.
Фокс новини на живо на KodiБлокът Finally се изпълнява дори ако използвате CTRL+C, за да спрете скрипта. Блокът също ще се изпълнява, ако ключова дума Exit спре скрипта от блок Catch.
В последния пример имах изявлението, което записва регистъра на грешките в текстов файл в Хвани блок. Въпреки това, най-доброто място за това твърдение е в a Най-накрая блок.
Вижте модифицирания скрипт по-долу...
|_+_|Допълнителна полезна информация за PowerShell Опитайте Catch
В този раздел ще споделя малко проста, но полезна информация за PowerShell Try Catch.
Как да изчистите PowerShell Опитайте Catch $Error Автоматична променлива
Автоматичната променлива $error има a Ясно Метод. Можете да използвате този метод, за да изчистите всички грешки, записани в автоматичната променлива $error.
За да изчистите всички грешки, записани в автоматичната променлива $error за текущата сесия на PowerShell, изпълнете командата по-долу.
|_+_|Как да покажете персонализирано съобщение за грешка в PowerShell Опитайте Catch Block
За да покажете персонализирано съобщение за грешка в PowerShell Try Catch Block, използвайте думата Throw. Ето един пример…
|_+_|Ето резултата от този скрипт в PowerShell ISE.
Как да получите информация за категорията за грешка в PowerShell Опитайте Catch
Автоматичната променлива $error има свойство, наречено CategoryInfo. За да видите това свойство и други свойства и методи, изпълнете командата по-долу...
|_+_|Извиква се едно от свойствата, върнати от последната команда Информация за категорията .
За достъп до тази информация изпълнете командата по-долу.
|_+_|Тази команда връща множество подсвойства.
Всяка от тези подсвойства може да бъде достъпна чрез добавяне на името на подсвойства след точка. Например, за да покажете подсвойствата на причината, изпълнете командата по-долу.
|_+_|
Как да използвате Write-Host за показване на съобщения за грешки в PowerShell Опитайте Catch
Подобно на свойството CategoryInfo в последния подраздел, автоматичната променлива $error също има свойство, наречено Изключение . За да покажете изключението в грешка, изпълнете командата по-долу:
|_+_|
За съжаление, ако се опитате да покажете тази информация с командата Write-Host, тя не работи според очакванията.
|_+_|Ето резултата от тази команда в PowerShell...
Както можете да видите, командата показва куп друга информация. Добрата новина е, че $error.Изключение има друго свойство, наречено Съобщение .
Можете да извикате тази подсвойство, като я добавите към $error.Изключение , като този…
|_+_|Освен това можете да използвате Write-Host команда за показване на тази информация за грешка...
|_+_|Последната команда сега показва действителното съобщение за грешка...
Освен че има конкретна причина за използване Write-Host както е показано в последната команда, можете просто да покажете същото съобщение за грешка с $error.Изключение команда.Как да създадете Hashtable в PowerShell Опитайте Catch Block
Има два често срещани начина, по които можете да създадете a Хеш-таблица на PowerShell в блок Try Catch.
- Можете да създадете хеш-таблица с множество двойки ключ/стойност в блока Try
- Като алтернатива можете да създадете единична хеш-таблица на ключ/стойност с Ключ извън Опитайте с Catc h блок и стойността в Опитайте с Catc h блок.
Ето пример за първия метод...
|_+_|Както можете да видите, hasttable е в Опитайте с Catc h блок...
От друга страна, можете да създадете единичен ключ за хеш-таблица със стойността, дефинирана в a Опитайте с Catc h блок. Ето един пример…
|_+_|За да потвърдя, че последният скрипт произвежда хеш-таблица на PowerShell, след като стартирах скрипта, извиках стойностите, записани в променливата $hashtable.
Както можете да видите от резултата от последната команда, тя има двойка име/стойност!
PowerShell Опитайте Catch Примери
В този последен раздел ще разгледам множество примери за приложението на PowerShell Try Catch.
Как да използвате PowerShell Опитай да хванеш С Get-Childitem
Командата Get-Childitem може да върне множество грешки. За да илюстрирам двете често срещани грешки, ще използвам двете команди по-долу:
|_+_|Правилният път до текстовия файл, използван в последната команда, е D:PS-Tutorialfilelist.txt.
Въпреки това, в първата команда включих интервал след D:PS-Tutorial. Това доведе до грешка (скоро ще определим подробностите за грешката).
Също така, във втората команда посочих правилния път, но използвах грешно име на файла. Това доведе до грешка.
|_+_|
Продължавайки, за да получа повече информация за тези грешки, ще изпълня командите в PowerShell Опитай да хванеш блок.
|_+_|Първата ни задача е да определим типовете грешки, върнати от командите. За да получите тази информация, изпълнете командите по-долу...
|_+_|Ето резултатите от командите...
Грешките, записани в автоматичната променлива $error, се съхраняват в масив на PowerShell. Достъпът до всеки обект в масива се осъществява чрез добавяне на [0], [1] в края на масива. 0 представлява първия елемент в масива, докато 1 представлява втория елемент и така нататък.Обратно към получаване на повече информация за грешките, допуснати от Get-Childitem команда, въз основа на типовете грешки, можем да модифицираме нашия блок Try Catch, за да улови тези 2 типа грешки...
|_+_|Втората ни задача е да покажем действителните съобщения за грешки. Тази команда ще свърши работа:
|_+_|Командата показва двете съобщения за грешка...
Как да използвате PowerShell Опитай да хванеш За да експортирате Get-WMIObject грешки с Export-csv
В този подраздел ще експортирам грешки, генерирани при стартиране Get-WMIObject на отдалечен компютър в CSV файл с Експортиране-csv команда.
Първо, нека видим подробностите за грешката, генерирани, когато се опитате да се свържете с офлайн отдалечен компютър с Get-WMIObject . За да илюстрирате това, изпълнете командата по-долу...
|_+_|Командата генерира съобщение за грешка, тъй като Компютър не е валидно име на компютър.
Продължавайки, за да управлявам грешката, ще изпълня командата в Опитвам блок от а Опитай да хванеш изявление.
|_+_|В първия ред на Опитвам блок, дефинирах променливата $ComputerName. След това, във втория ред, пуснах Get-WmiObject команда.
Освен това, в Хвани блок, създадох подробностите за грешката, експортирах ги в CSV файл с Експортиране-csv .
Ето подробно обяснение на скрипта в Опитвам блок:
- В ред 1 създадох променлива $path, която указва къде искам да запиша CSV файла
- След това на ред 2 използвах командата Get-Date, за да създам име на файла за CSV файла. Името на файла е във формата, yyyyMMdd_HHmmss.csv
- В ред 3 създадох празен обект, запазен в променлива, наречена $data
- След това в ред 4 добавих колоната „Име на компютъра“ в обекта, който създадох в ред 3. Колоната приема променливата $ComputerName
- В ред 5 добавих тома „Съобщение за грешка“, който ще запази съобщенията за грешка, $error.Exception.Message
- След това, в ред 6, създадох променлива $csvfilepath, която комбинира променливите $path и $csvfilename, за да създам пълен път към CSV файла
- Накрая, в ред 7, прехвърлих информацията, записана в променливата $data ($ComputerName и $error.Exception.Message) в Експортиране-csv и запази файла в $csvfilepath
Екранната снимка по-долу показва CSV, създаден от скрипта...
Как да хванете грешки в процеса на получаване с PowerShell Опитай да хванеш Изявление
Ако изпълните командата Get-Process с идентификатор на процес, който не съществува, тя ще върне a Microsoft.PowerShell.Commands.ProcessCommandException грешка.
За да уловите този конкретен тип изключение, изпълнете команда, подобна на тази по-долу:
|_+_|Ето резултата от скрипта в PowerShell ISE.
Като алтернатива можете да дефинирате персонализирано съобщение за грешка, като промените скрипта, както е показано по-долу...
|_+_|Сега скриптът връща персонализираното съобщение за грешка...
Как да хванете грешки в Get-Mailbox с PowerShell Опитай да хванеш Изявление
Ако се свържете с Office 365 PowerShell и стартирате Вземете пощенска кутия срещу потребител, който не съществува, ще получите съобщение за грешка. Някои потребители съобщават, че имат проблеми със заснемането на съобщението за грешка Вземете пощенска кутия команда.
За да тествате този сценарий, след като се свържете с нашия Office 365 акаунт чрез PowerShell, стартирах скрипта по-долу:
|_+_| Потребителят, Pius, не съществува в нашия акаунт в Office 365.Скриптът върна съобщението за грешка Операцията не можа да бъде извършена, защото обектът „Пий“ не може да бъде намерен на „AM6PR05A05DC002.EURPR05A005.PROD.OUTLOOK.COM '.
Ето екранната снимка…
Въпреки това, ако Опитай да хванеш улавя грешката, опитайте да добавите типа на изключението, както е показано в модифицираната команда по-долу:
|_+_|Това е всичко – нашето изчерпателно и актуализирано ръководство за PowerShell Опитайте Catch Final лай! Надявам се, че ви е било полезно?
Ако го намерите за полезно, любезно гласувайте да до въпроса полезна ли е тази публикация по-долу.
Като алтернатива можете да зададете въпрос, да оставите коментар или да предоставите повече обратна връзка с формуляра за отговор, който се намира в края на тази страница.
как да получите хапче обратно хак
И накрая, за повече PowerShell tech S зони, посетете нашата страница с инструкции за Windows PowerShell. Може също да намерите нашата страница „Работа от дома“ за много полезна.
Препратки и допълнителна литература
- Относно Try Catch Finally
- Относно Trap
- PowerShell масив и добавяне към масив: приложения и примери
- Powershell For Loop Обяснено: Синтаксис и примери


