Sådan bruges PowerShell Prøv Catch Endelig for at håndtere fejl

15. juli 2021 10258 Visninger Andre vigtige oplysninger om PowerShell Prøv

En PowerShell Prøv Catch blok bruges til at håndtere fejl i PowerShell-scripting. Når du bruger PowerShell Prøv Catch blok for scripting kan du opnå følgende:





  1. Få dit script til at fortsætte med at køre på trods af en fejl
  2. Vise og håndtere fejlmeddelelser bedre

I denne guide lærer du, hvordan du bruger Powershell Prøv Catch blokke til at håndtere afsluttende fejlmeddelelser i PowerShell. Derudover vil du lære, hvordan du inkluderer Langt om længe blokere i en Prøv Catch blok.



Guiden starter med syntaksen for Prøv Catch blok.

Gennemse indlægsemner



PowerShell Prøv Catch Syntaks

PowerShell Prøv Catch Syntax

Syntaksen for PowerShell Prøv Catch er…



|_+_|

Det Prøve er den del af blokken, du vil have PowerShell til at overvåge for fejl. Dette er blokken med de originale scripts, der kan returnere en afsluttende fejl.

Når der opstår en fejl i Try-blokken, gemmer PowerShell fejlen i den automatiske variabel $Error (mere om dette senere).



På den anden side, t han fangst erklæring fra PowerShell Prøv Catch blok håndterer de fejl, der genereres i prøveblokken. Du kan også angive de typer fejl, der håndteres i Fangst erklæringsblok.



Det Langt om længe blok kan bruges til at frigøre ressourcer, der ikke længere er nødvendige for scriptet.

Almindelige typer af undtagelsesfejl i PowerShell Prøv Catch

Typer af fejl i PowerShell Prøv Catch

Du kan håndtere forskellige typer fejl i en PowerShell Try Catch-blok. For eksempel kan du håndtere specifikke fejl.

Derudover kan du håndtere generiske fejlmeddelelser. For at håndtere specifikke typer fejl skal du dog kende fejltypen.

senere i denne vejledning vil du lære, at fejlmeddelelser gemmes i den automatiske variabel $error. Derudover kan fejl også gemmes i $_ pipeline-variablen.

Desuden gemmes fejl gemt i $error automatisk variabel i et array. For at hjælpe med at forklare dette, lad os køre en kommando, der returnerer en afsluttende fejlmeddelelse:

For at slette alle fejl, der tidligere er gemt i $fejl automatisk variabel, før du kører kommandoen nedenfor, skal du først køre $error.Clear() kommando. |_+_| Der er ingen hændelseslog kaldet Systerr, så kommandoen i Prøv-blokken sender en fejlmeddelelse.

Overraskende nok viste kommandoen ingen fejlmeddelelse. Så hvad skete der med fejlmeddelelsen?

Den er gemt i den automatiske variabel $error! For at vise fejlen fra den sidste kommando, gemt i $error-variablen, skal du køre kommandoen...

|_+_|

Resultatet af kommandoen viser fejldetaljerne, der er gemt i den automatiske variabel $error. Fejlinformationen har et afsnit kaldet FullyQualifiedErrorId .

For denne specifikke fejl er FullyQualifiedErrorId har to sæt informationer – System.InvalidOperationException og Microsoft.PowerShell.Commands.GetEventLogCommand .

Den information vi er interesseret i er System.InvalidOperationException . Dette er en type fejl, du kan fangst i PowerShell Try Catch-blokken.

For at få navnet på denne PowerShell-undtagelse skal du køre kommandoen nedenfor:

|_+_|

Der er det, System.InvalidOperationException !

I de næste par underafsnit vil jeg diskutere almindelige PowerShell Try Catch Exception-fejl.

PowerShell Prøv Catch CommandNotFoundException Fejl

Hvis du kører en kommando, der ikke findes i PowerShell eller Microsoft Command Prompt, vil du modtage en fejlmeddelelse. For eksempel, hvis du kører Hent-fil kommando, vil du modtage en fejlmeddelelse, fordi denne kommando ikke er en gyldig PowerShell Cmdlet.

Her er et skærmbillede af resultatet af kommandoen i PowerShell...

PowerShell Prøv Catch CommandNotFoundException-fejl

Som du kan se på skærmbilledet, er typen af ​​undtagelse (FullyQualifiedErrorId ). CommandNotFoundException .

hvordan man sletter ventende opdateringer windows 10

Da dette er en afsluttende fejl, vil det forhindre dit script i at fortsætte. For at forhindre denne fejl i at afslutte dit script skal du pakke kommandoen ind i en Prøv Catch blok.

Hvis vi pakker denne fejl ind i en PowerShell Try Catch-blok, vil PowerShell undertrykke fejlen. Desuden vil det stoppe med at afslutte dit script.

Men selvom fejlen er undertrykt, gemmes den i $error-variablen. Som sædvanlig, før du kører kommandoen nedenfor, skal du først rydde de fejl, der er gemt i $error-variablen.

|_+_|

Hvis du ønsker at køre kommandoen i PowerShell i stedet for PowerShell ISE, skal du skrive kommandoerne på en enkelt linje som vist nedenfor:

|_+_|

Kør derefter for at vise fejlen...

|_+_|

Som jeg nævnte i hovedintroduktionen til dette afsnit, skal du køre kommandoen nedenfor for at vise undtagelses-id'et for denne fejl:

|_+_|

Det fulde navn på undtagelsen er System.Management.Automation.CommandNotFoundException .

PowerShell Prøv Catch ManagementObjectNotFoundException Fejl

Når du kører en kommando i en ekstern PS-session med de forkerte oplysninger, returnerer PowerShell en ManagementObjectNotFoundException fejl.

Et typisk scenarie er, når du opretter forbindelse til Office 365 med PowerShell. Kør derefter kommandoen Get-User, men angiv den forkerte bruger identitet .

PowerShell Prøv Catch ManagementObjectNotFoundException Error

For at fange denne fejl med PowerShell Prøv Catch, brug en kommando, der ligner den nedenfor:

|_+_| At fange ManagementObjectNotFoundException fejl med PowerShell Try, Catch er særlig vanskelig. Du skal bruge Fejlhandling parameter og specificer Hold op . Ellers vil fejlen stadig blive vist, selv med Try, Catch.

Til sidst, for at få navnet på undtagelsen, skal du bruge kommandoen nedenfor:

|_+_|

Kommandoen returnerer typen af ​​undtagelse som System.Management.Automation.RemoteException . Så hvad er ManagementObjectNotFoundException ?

ManagementObjectNotFoundException er årsagen til undtagelsen som bekræftet af kommandoen nedenfor:

|_+_|

PowerShell Prøv Catch UnauthorizedAccessException Fejl

En anden almindelig PowerShell-undtagelsesfejl er UnauthorizedAccessException . Denne type fejl opstår, når du forsøger at få adgang til et element, du ikke har mindst en læsetilladelse.

For at illustrere dette eksempel nægtede jeg godkendte brugere adgang til en bestemt fil på min computer.

PowerShell Prøv Catch UnauthorizedAccessException-fejl

Hvis jeg nu prøver at få adgang til filen med kommandoen Get-Content, modtager jeg en besked om adgang nægtet.

|_+_|

For at stoppe denne fejlvisning skal du køre kommandoen i PowerShell Try Catch-blokken som vist nedenfor...

|_+_|

Desværre stopper kommandoen ovenfor ikke fejlmeddelelsen. Årsagen er, at det ikke er en afsluttende fejl.

For at stoppe fejlvisningen skal du inkludere Fejlhandling parameter og specificer Hold op .

|_+_|

Nu undertrykker kommandoen fejlen. For at få vist typen af ​​undtagelse skal du køre kommandoen nedenfor...

|_+_|

Typen af ​​undtagelse er System.UnauthorizedAccessException .

Der er flere typer undtagelsesfejl, end hvad der er dækket i dette afsnit. Jeg dækkede kun de mest almindelige typer undtagelser.

Sådan fanger du specifikke undtagelser med PowerShell Prøv Catch

Sådan fanger du specifikke undtagelser med PowerShell Prøv Catch

Det sidste afsnit diskuterede almindelige PowerShell-undtagelser og hvordan man finder typen af ​​undtagelse. Dette afsnit vil dække, hvordan du bruger disse oplysninger til at fange specifikke typer fejlmeddelelser.

Avast bruger al hukommelse

I syntaksafsnittet i denne vejledning sagde jeg, at den generelle syntaks for en PowerShell Try Catch Endelig er...

|_+_|

I syntaksens catch-blok kan du se [fejltypen]. Det er her du angiver den type fejl du vil fange i denne blok.

For at fange UnauthorizedAccessException-fejl skal du f.eks. bruge sætningerne nedenfor...

|_+_|

For at køre kommandoen i PowerShell skal du angive sætningerne på en enkelt linje. Den første del af sætningen – $error.Clear() – sletter eventuelle fejl, der er gemt i variablen $error.

|_+_|

Sådan tilføjer du flere Fangst Blokke i en PowerShell Prøv Catch Udmelding

I introduktionen af ​​dette afsnit viste jeg dig, hvordan du fanger en bestemt type undtagelse i Fangst blok. Du kan angive flere

Her er et eksempel...

|_+_|

I dette eksempel er det første fangst blok håndterer de angivne typer undtagelser. Desuden den anden fangst blokhåndtag håndterer generiske fejl.

Sådan udpakkes fejlundtagelse med PowerShell Prøv Catch

Det sidste underafsnit dækkede, hvordan man specificerer flere catch-blokke for at håndtere forskellige typer undtagelser. I dette underafsnit lærer du, hvordan du uddrager fejldetaljerne i en undtagelse.

For at illustrere dette vil jeg bruge et eksempel, jeg brugte tidligere. Kør denne PowerShell-sætning i PowerShell.

|_+_|

Kør nu $error alene...

|_+_|

Selvom flere oplysninger er gemt i $error-variablen, er den faktiske fejlmeddelelse fremhævet på skærmbilledet nedenfor.

Sådan udtrækker du fejloplysninger med PowerShell Prøv Catch

Hvis du vil logge denne fejl i en tekstfil, skal du kun logge de faktiske fejloplysninger. For at udtrække denne fejl, brug kommandoen nedenfor:

|_+_|

Kommandoen uddrager den faktiske fejlmeddelelse Adgang til stien 'D:PS-Tutorialmappenavne.txt' nægtes.

Du kan skrive denne fejlmeddelelse ind i en logfil ved at inkludere en Ud-fil kommando i Catch-blokken.

|_+_| Jeg inkluderede Tilføj parameter i Ud-fil kommando for at tillade logning af flere poster uden at overskrive de tidligere poster.

For at gøre det nemt at forstå den sidste kommando, vil jeg omskrive den i scriptformatet nedenfor...

|_+_|

Sådan inkluderes A Langt om længe Bloker til PowerShell Prøv Catch Udmelding

Sådan inkluderes en endelig blok til PowerShell Try Catch-erklæring

Du kan inkludere en Langt om længe blokere til PowerShell Prøv Catch Udmelding. Syntaksen er

|_+_|

Det langt om længe blok kan bruges til at frigøre ressourcer, der ikke længere er nødvendige for scriptet.

En endelig blok kører, selvom du bruger CTRL+C til at stoppe scriptet. Blokken vil også køre, hvis et Exit-nøgleord stopper scriptet inde fra en Catch-blok.

I det sidste eksempel havde jeg den erklæring, der skriver fejlloggen til en tekstfil i Fangst blok. Det bedste sted at have den erklæring er dog i en Langt om længe blok.

Se det ændrede script nedenfor...

|_+_|

Yderligere nyttige oplysninger om PowerShell Prøv Catch

Andre vigtige oplysninger om PowerShell Prøv

I dette afsnit vil jeg dele nogle enkle, men nyttige oplysninger om PowerShell Try Catch.

Sådan rydder du PowerShell Prøv Catch $Error Automatic Variable

Den automatiske variabel $error har en Klar Metode. Du kan bruge denne metode til at rydde alle fejl gemt i den automatiske variabel $error.

For at rydde alle fejl, der er gemt i den automatiske variabel $error for den aktuelle PowerShell-session, skal du køre kommandoen nedenfor.

|_+_|

Sådan viser du en brugerdefineret fejlmeddelelse i PowerShell Prøv Catch Block

For at vise en brugerdefineret fejlmeddelelse i en PowerShell Try Catch Block, skal du bruge Throw-ordet. Her er et eksempel...

|_+_|

Her er resultatet af dette script i PowerShell ISE.

Sådan viser du en brugerdefineret fejlmeddelelse i PowerShell Prøv Catch Block

Sådan får du oplysninger om fejlkategorioplysninger i PowerShell Prøv Catch

Den automatiske variabel $error har en egenskab kaldet CategoryInfo. For at se denne egenskab og andre egenskaber og metoder skal du køre kommandoen nedenfor...

|_+_|

En af egenskaberne returneret af den sidste kommando kaldes Kategoriinfo .

For at få adgang til disse oplysninger skal du køre kommandoen nedenfor.

|_+_|

Denne kommando returnerer flere underegenskaber.

Sådan får du oplysninger om fejlkategorioplysninger i PowerShell Prøv Catch

Hver af disse underegenskaber kan tilgås ved at tilføje underegenskabernes navn efter et punktum. For at få vist underegenskaberne Reason skal du for eksempel køre kommandoen nedenfor.

|_+_|

Sådan bruges Write-Host til at vise fejlmeddelelser i PowerShell Prøv Catch

Ligesom CategoryInfo-egenskaben i sidste underafsnit, har den automatiske variabel $error også en egenskab kaldet Undtagelse . For at vise undtagelsen i en fejl, kør kommandoen nedenfor:

1kanals addon fungerer ikke
|_+_|

Desværre, hvis du prøver at vise disse oplysninger med kommandoen Write-Host, virker det ikke som forventet.

|_+_|

Her er resultatet af denne kommando i PowerShell...

Sådan bruges Write-Host til at vise fejlmeddelelser i PowerShell Prøv Catch

Som du kan se, viser kommandoen en masse andre oplysninger. Den gode nyhed er, at $error.Undtagelse har en anden ejendom kaldet Besked .

Du kan kalde denne underejendom ved at tilføje den til $error.Undtagelse , sådan her…

|_+_|

Derudover kan du bruge Skriv-vært kommando for at vise denne fejlinformation...

|_+_|

Den sidste kommando viser nu den faktiske fejlmeddelelse...

Bortset fra at der er en specifik grund til at bruge Skriv-vært som vist i den sidste kommando, kan du blot vise den samme fejlmeddelelse med $error.Undtagelse kommando.

Sådan opretter du en hashtabel i en PowerShell Prøv Catch Block

Der er to almindelige måder, du kan oprette en PowerShell hashable i en Try Catch-blok.

  1. Du kan oprette en hashtabel med flere nøgle/værdi-par i Prøv-blokken
  2. Alternativt kan du oprette en enkelt nøgle/værdi-hashtabel med Nøgle udenfor Prøv Catc h blok og værdien inden for Prøv Catc h blok.

Her er et eksempel på den første metode...

|_+_|

Som du kan se, er hastable inden for Prøv Catc h blok...

På den anden side kan du oprette en enkelt hashbar nøgle med værdien defineret i en Prøv Catc h blok. Her er et eksempel...

|_+_|

For at bekræfte, at det sidste script producerer en PowerShell-hashtabel, kaldte jeg efter at have kørt scriptet de værdier, der er gemt i $hashtable-variablen.

Som du kan se fra resultatet af den sidste kommando, har den et navn/værdi-par!

PowerShell Prøv Catch-eksempler

PowerShell Prøv Catch-eksempler

I dette sidste afsnit vil jeg dække flere eksempler på anvendelsen af ​​PowerShell Try Catch.

Sådan bruges PowerShell Prøv Catch Med Get-Childitem

Kommandoen Get-Childitem kan returnere flere fejl. For at illustrere de to almindelige fejl, vil jeg bruge de to kommandoer nedenfor:

|_+_|

Den korrekte sti til tekstfilen brugt i den sidste kommando er D:PS-Tutorialfilelist.txt.

Men i den første kommando inkluderede jeg et mellemrum efter D:PS-Tutorial. Dette resulterede i en fejl (vi finder snart ud af fejldetaljerne).

Også i den anden kommando specificerede jeg den korrekte sti, men brugte det forkerte filnavn. Dette resulterede i en fejl.

|_+_| Sådan bruger du PowerShell Prøv Catch With Get-Childitem

For at få mere information om disse fejl, kører jeg kommandoerne i en PowerShell Prøv Catch blok.

|_+_|

Vores første opgave er at bestemme de typer fejl, der returneres af kommandoerne. For at få disse oplysninger skal du køre kommandoerne nedenfor...

|_+_|

Her er resultaterne af kommandoerne...

Sådan bruges PowerShell Prøv Catch at eksportere Get-WMIObject-fejl med Export-csvFejl, der er gemt i den automatiske variabel $error, gemmes i et PowerShell-array. Hvert objekt i arrayet tilgås ved at tilføje en [0], [1] i slutningen af ​​arrayet. 0 repræsenterer det første element i arrayet, mens 1 repræsenterer det andet element og så videre.

Tilbage til at få mere information om de fejl, som Get-Childitem kommando, baseret på fejltyperne, kan vi ændre vores Try Catch-blok for at fange disse 2 typer fejl...

|_+_|

Vores anden opgave er at vise de faktiske fejlmeddelelser. Denne kommando vil gøre jobbet:

|_+_|

Kommandoen viser de to fejlmeddelelser...

Sådan bruges PowerShell Prøv Catch For at eksportere Get-WMIObject-fejl med Export-csv

I dette underafsnit vil jeg eksportere fejl genereret, når jeg kører Hent-WMIObject på en fjerncomputer til en CSV-fil med Eksport-csv kommando.

Lad os først se fejldetaljerne, der genereres, når du prøver at oprette forbindelse til en offline fjerncomputer med Hent-WMIObject . For at illustrere dette, kør kommandoen nedenfor...

|_+_|

Kommandoen genererede en fejlmeddelelse, fordi Computer er ikke et gyldigt pc-navn.

Sådan fanger du Get-Process-fejl med PowerShell Prøv Catch Statement

Går jeg videre, for at håndtere fejlen, vil jeg køre kommandoen i Prøve blok af en Prøv Catch udmelding.

|_+_|

I den første linje af Prøve blok, definerede jeg $ComputerName-variablen. Så, i anden linje, kørte jeg Hent-WmiObject kommando.

Desuden i Fangst blok, oprettede jeg fejldetaljerne eksporterede den til en CSV-fil med Eksport-csv .

Her er en detaljeret forklaring af scriptet i Prøve blok:

  1. I linje 1 oprettede jeg en $path-variabel, der angiver, hvor jeg vil gemme CSV-filen
  2. Derefter brugte jeg i linje 2 kommandoen Get-Date til at oprette et filnavn til CSV-filen. Filnavnet er i formatet, ååååMMdd_HHmmss.csv
  3. I linje 3 oprettede jeg et tomt objekt gemt i en variabel kaldet $data
  4. Derefter tilføjede jeg i linje 4 kolonnen 'Computer Name' til det objekt, jeg oprettede i linje 3. Kolonnen tager variablen $ComputerName
  5. I linje 5 tilføjede jeg volumen 'Fejlmeddelelse', der gemmer fejlmeddelelserne, $error.Exception.Message
  6. Derefter oprettede jeg i linje 6 en $csvfilepath-variabel, der kombinerer variablerne $path og $csvfilename for at skabe en fuld sti til CSV-filen
  7. Til sidst, i linje 7, sendte jeg oplysningerne gemt i $data-variablen ($ComputerName og $error.Exception.Message) ind i Eksport-csv og gemte filen i $csvfilepath
Det NoTypeInformation parameter i kommandoen Export-csv fjerner typeoplysninger. For at finde ud af mere, læs vores guide, Powershell NoTypeInformation: Applikationer og eksempler

Skærmbilledet nedenfor viser den CSV, der er oprettet af scriptet...

Sådan fanges Get-Process-fejl med PowerShell Prøv Catch Udmelding

Hvis du kører kommandoen Get-Process med et proces-id, der ikke eksisterer, vil det returnere en Microsoft.PowerShell.Commands.ProcessCommandException fejl.

For at fange denne specifikke type undtagelse skal du køre en kommando, der ligner den nedenfor:

|_+_|

Her er resultatet af scriptet i PowerShell ISE.

Alternativt kan du definere en brugerdefineret fejlmeddelelse ved at ændre scriptet som vist nedenfor...

|_+_|

Nu returnerer scriptet den tilpassede fejlmeddelelse...

Sådan fanges Get-Mailbox-fejl med PowerShell Prøv Catch Udmelding

Hvis du opretter forbindelse til Office 365 PowerShell og kører Get-Mailbox mod en bruger, der ikke eksisterer, får du en fejlmeddelelse. Nogle brugere har rapporteret at have problemer med at fange fejlmeddelelsen Get-Mailbox kommando.

For at teste dette scenarie, efter at have oprettet forbindelse til vores Office 365-konto via PowerShell kørte jeg scriptet nedenfor:

|_+_| Brugeren, Pius, findes ikke i vores Office 365-konto.

Scriptet returnerede fejlmeddelelsen Handlingen kunne ikke udføres, fordi objektet 'Pius' ikke kunne findes på 'AM6PR05A05DC002.EURPR05A005.PROD.OUTLOOK.COM '.

Her er skærmbilledet...

Men hvis Prøv Catch fanger fejlen, prøv at tilføje undtagelsestypen som vist i den ændrede kommando nedenfor:

hvordan man downloader youtube-videoer uden software i Google Chrome
|_+_|

Det er det – vores omfattende og opdaterede guide om PowerShell Prøv Catch Final ly! Jeg håber du fandt det nyttigt?

Hvis du fandt det nyttigt, så stem venligst Ja til spørgsmålet Var dette indlæg nyttigt nedenfor.

Alternativt kan du stille et spørgsmål, efterlade en kommentar eller give mere feedback med formularen Efterlad et svar, som findes i slutningen af ​​denne side.

Endelig, for flere PowerShell tech S Zones, besøg vores Windows PowerShell How-To guide-side. Du kan også finde vores Work from Home-side meget nyttig.

Referencer og videre læsning

  1. Om Try Catch Finally
  2. Om Trap
  3. PowerShell Array og Tilføj til Array: applikationer og eksempler
  4. Powershell For Loop Forklaret: Syntaks og eksempler