Adam Automator

Har du nogensinde køre et script eller et PowerShell-cmdlet og få konfronteret med en skrigende mur af tekst – i rød – ligesom en, der er vist nedenfor?

Eksempel på fejl i PowerShell

Fejl kan blive overvældende og forvirrende. Og mest af alt er fejl ofte svære at læse, hvilket gør det umuligt at bestemme, hvad og hvor scriptet gik galt i nærheden.,heldigvis har du nogle muligheder i Po .ershell for at gøre dette bedre gennem fejlhåndtering. Ved hjælp af fejlhåndtering kan fejl filtreres og vises på en sådan måde, at det er lettere at få mening ud af. Og forståelse af fejlen gør det nemt at tilføje mere logik til fejlhåndtering.

I denne artikel, vil du lære om fejl i PowerShell, og hvordan de kan blive opfanget at udføre håndtering af fejl ved hjælp af PowerShell Try Catch blokke (og finally blokke).,

Indholdsfortegnelse

Forståelse af, Hvordan Fejl Arbejde i PowerShell

Før dykning i fejlhåndtering, lad os først dække nogle begreber omkring fejl i PowerShell. Forståelse af fejl kan føre til bedre fejlhåndteringsstrategier.

den automatiske $ – variabel

i Po .ershell er der mange automatiske variabler, og en af dem er $Error automatisk variabel. Po .ershell bruger variablen$Error til at gemme alle fejl, der opstår i sessionen., Variablen$Error er en række fejl sorteret efter seneste.

Når du først åbner en Po .ershell-session, er variablen $Error tom. Du kan tjekke det ved at kalde variablen $Error.

Den $Fejl variabel er tom

Som du kan se, den $Error variabel starter tomme., Men når en fejl er genereret, tilføjes fejlen og gemmes i variablen$Error.

i eksemplet nedenfor genereres fejlen ved bevidst at få et servicenavn, der ikke findes.

PS> Get-Service xyzPS> $ErrorPS> $Error.Count
fejlen er tilføjet til $Fejl variabel

Som du kan se fra ovenstående output, den genererede fejl blev tilføjet til $Error variabel.,

$Error-variablen indeholder en samling af fejl, der genereres i Po .ershell-sessionen. Hver fejl kan være Adgang ved at kalde sin array position. Den seneste fejl vil altid være på indeks 0.for eksempel kan den seneste fejl hentes ved hjælp af $Error.

$Error Egenskaber for Objekt

Da alt i PowerShell er et objekt, $Error variabel er et objekt, og objekter har egenskaber., Ved rørledning af variablen $Error til Get-Member cmdlet, skal du se listen over tilgængelige egenskaber.

$Error | Get-Member
Den $Error egenskaber for objekt

for At fastslå årsagen til fejlen, du kan se indholdet af InvocationInfo ejendom ved hjælp af kommandoen nedenfor.,

$Error.InvocationInfo

Den InvocationInfo ejendom

Nu, du kan gøre det samme med de andre ejendomme, og opdage, hvad andre oplysninger, du kan finde!

Afslutningsfejl

Afslutningsfejl stop eksekveringsflo .et, når det opstår af Po .ershell vs ikke-afslutningsfejl. Der er flere måder, hvorpå en afslutningsfejl kan opstå. Et eksempel er, når du kalder en cmdlet med en parameter, der ikke findes.,

som du vil fra skærmbilledet nedenfor, når kommandoen Get-Process notepad kører, er kommandoen gyldig, og detaljerne i notepad-processen vises.

notesblok proces detaljer

Men, når en parameter, der findes ikke bruges som Get-Process notepad -handle 251 cmdlet viser en fejl, at handle parameter er ikke gyldig. Derefter afslutter cmdlet uden at vise detaljerne i notepad – processen.,

Fejl er kastet, fordi parameter er ugyldig

Ikke-Afslutning Fejl

Ikke-afslutning fejl er fejl, at ikke stoppe udførelsen af scriptet eller kommando. Tjek for eksempel koden nedenfor. Denne kode får listen over filnavne fra fillisten.t filet-fil. Derefter går scriptet gennem hvert filnavn, læser indholdet af hver fil og udsender det på skærmen.

$file_list = Get-Content .\filelist.txtforeach ($file in $file_list) { Write-Output "Reading file $file" Get-Content $file}

Indholdet af fillisten.,t .t-fil er filnavne, der vises på listen nedenfor.

File_1.logFile_2.logFile_3.logFile_4.logFile_5.logFile_6.logFile_7.logFile_8.logFile_9.logFile_10.log

men hvad nu hvis File_6.log eksisterede faktisk ikke? Når du kører koden, ville du forvente en fejl vil ske, fordi scriptet ikke kan finde File_6.log. Du vil se en lignende output vist nedenfor.

Eksempel på ikke-afslutning fejl

Som du kan se på screenshot af resultatet ovenfor, at manuskriptet var i stand til at læse de første fem-filer på listen, men når det forsøgt at læse filen File_6.,t .t, returneres en fejl. Scriptet fortsatte derefter med at læse resten af filerne, før de sluttede. Det ophørte ikke.

variablen $ErrorActionPreference

indtil videre har du lært om terminerings-og ikke-termineringsfejl, og hvordan de adskiller sig fra hinanden. Men vidste du, at en ikke-afslutningsfejl kan tvinges til at blive behandlet som en afslutningsfejl?

Po .ershell har et koncept kaldet præference variabler. Disse variabler bruges til at ændre, hvordan Po .ershell opfører sig mange forskellige måder. En af disse variabler kaldes $ErrorActionPreference.,

variablen$ErrorActionPreference bruges til at ændre den måde, Po .ershell behandler ikke-terminerende fejl på. Som standard er værdien $ErrorActionPreference indstillet til Continue. Ændre værdien af $ErrorActionPreference variabel STOPtvinger PowerShell til at behandle alle de fejl, som afslutning fejl.

Brug koden nedenfor til at ændre $ErrorActionPreference værdi.,

$ErrorActionPreference = "STOP"

for At lære mere om andre gyldige $ErrorActionPreference variable værdier, besøg PowerShell ErrorActionPreference.

se nu tilbage til det eksempel, der bruges i afsnittet om ikke-terminerende fejl i denne artikel. Scriptet kan ændres til at omfatte ændring i $ErrorActionPreference ligesom den kode vist nedenfor:

Kører den ændrede koden ovenfor vil opføre sig anderledes end før, hvor $ErrorActionPreference værdien er sat til standard værdi af Continue.,

Tvinger en afslutning fejl ved brug af $ErrorActionPreference variabel

Som du kan se på screenshot af resultatet ovenfor, manuskriptet var i stand til at læse de første fem-filer på listen, men når det forsøgt at læse filen File_6.t .t, returneres en fejl, fordi filen ikke blev fundet. Derefter afsluttes scriptet, og resten af filerne læses ikke.,

$ErrorActionPreference værdien er kun gyldig i den aktuelle Po .ershell-session. Den nulstilles til standardværdien, når en ny PO .ershell-session er startet.

ErrorAction Fælles Parameter

Hvis $ErrorActionPreference værdi er anvendt til PowerShell session, den ErrorAction parameter gælder for alle cmdlet, der understøtter fælles parametre. ParameterenErrorAction accepterer de samme værdier, som variablen$ErrorActionPreference gør.,

ErrorAction parameterværdi, har forrang for det $ErrorActionPreference værdi.

lad os gå tilbage og bruge den samme kode i det foregående eksempel. Men denne gang tilføjes parameteren ErrorAction til linjen Get-Content.

Når du har kørt den ændrede kode, vil du se, at selvom $ErrorActionPreferenceer indstillet til Continue, afsluttes scriptet stadig, når det har fundet en fejl., Scriptet afsluttes, fordi -ErrorAction parameterværdien i Get-Content er indstillet til STOP.

Tvinger en afslutning fejl ved brug af ErrorAction parameter

ved Hjælp af PowerShell Prøve Catch-Blokke

På dette punkt, du har lært om PowerShell fejl og hvordan de $ErrorActionPreference variabel og ErrorAction parametre arbejde., Nu er det tid, du lærer om de gode ting – Po .ershell Try Catch Finally blokke.

PowerShell try catch blokke (og eventuelt finally block) er en måde at kaste et net omkring et stykke kode og fange eventuelle fejl, at vende tilbage.

koden nedenfor viser syntaksen afTry erklæring.

try { <statement list>}catch *]{ <statement list>}finally { <statement list>}

Try block indeholder den kode, du vil have Po .ershell til at “prøve” og overvåge for fejl., Hvis koden i Try block støder på en fejl, tilføjes fejlen til variablen $Error og overføres derefter tilCatch block.

Catch blok indeholder de handlinger, der skal udføres, når den modtager en fejl fra Try bloker. Der kan være flere Catch blokke i en Try erklæring.

Finally block indeholder den kode, der vil i slutningen afTry erklæring., Denne blok kører, uanset om en fejl blev uncounted.

Indhente Ikke-Specifikke Fejl (Catch-All)

En enkel Try erklæring indeholder en Try og Catch bloker. Finally blokken er valgfri.

for eksempel for at fange en ikke-specifik undtagelse, skal parameterenCatch være tom. Eksempelkoden nedenfor bruger det samme script, der blev brugt i afsnittet $ErrorActionPreference, men ændret til at bruge Try Catch blokke.,

som du kan se fra koden nedenfor, er denne gang foreachsætningen lukket inde i Try blokken. Derefter indeholder enCatch block koden til at vise strengen An Error Occurred hvis der opstod en fejl. Koden i Finally block rydder kun variablen $Error.

koden ovenfor, efter at have kørt i Po .ershell, giver dig denne output vist nedenfor.,

Scriptet afsluttes, når der opstod en fejl

output ovenfor viser, at scriptet opstod en fejl, løb kode inde i Catch blok, og derefter afsluttet.

fejlen blev håndteret, hvilket var punktet for fejlhåndtering. Den viste fejl var imidlertid for generisk. For at vise en mere beskrivende fejl kan du få adgang til Exception egenskaben for den fejl, der blev passeret af Try – blokken.,

koden nedenfor er ændret, specielt koden inde i Catch bloker for, at vise undtagelse besked fra den aktuelle fejl, der var gået ned pipeline – $PSItem.Exception.Message

Denne gang, når den modificerede kode ovenstående er kørt, den meddelelse, der vises, er meget mere beskrivende.,

Scriptet afsluttes med en beskrivende fejlmeddelelse

Fangst af Bestemte Fejl

Der er tidspunkter, når en catch-all fejlhåndtering er ikke den mest hensigtsmæssige metode. Måske vil du have dit script til at udføre en handling, der er afhængig af den type fejl, der opstår.

hvordan bestemmer du fejltypen? Ved at kontrollereTypeName værdien afException egenskaben for den sidste fejl., For eksempel at finde fejltypen fra det forrige eksempel skal du bruge denne kommando:

$Error.Exception | Get-Member

resultatet af koden ovenfor vil se ud som skærmbilledet nedenfor. Som du kan se, vises TypeName – værdien – System.Management.Automation.ItemNotFoundException.

at Få fejlen TypeName værdi

Nu, hvor du ved, den type fejl, som du har brug for at opfange, ændre koden til at fange det specifikt., Som du ser fra den ændrede kode nedenfor, er der nu toCatch blokke. Den første Catch block opfanger en bestemt type fejl (System.Management.Automation.ItemNotFoundException). I modsætning hertil indeholder den anden Catch block den generiske, catch-all fejlmeddelelse.

skærmbilledet nedenfor viser output fra den ændrede kode ovenfor.,

Scriptet afsluttes med en bestemt fejlmeddelelse

Konklusion

I denne artikel, du har lært om fejl i PowerShell, dens egenskaber, og hvordan du kan afgøre en fejl specifikke type. Du har også lært forskellen mellem, hvordan den $ErrorActionPreference variabel ErrorAction parameter påvirker, hvordan PowerShell behandler ikke-terminering fejl.,

Du har også lært at bruge PowerShell Try Catch Finally blocks for at udføre fejlhåndtering, uanset om specifikke fejl eller en catch-all ” – tilgang.

eksemplerne, der vises i denne artikel, viser kun det grundlæggende i, hvordan Try Catch Finally blokke fungerer. Den viden, som jeg håber, du har fået i denne artikel, skal give dig startblokkene til at begynde at anvende fejlhåndtering i dine scripts.,

Yderligere Læsning

  • About_Try_Catch_Finally
  • About_Automatic_Variables
  • Tilbage til Basics: PowerShell foreach-Løkken
  • Tilbage til det Basale: Forståelse PowerShell Genstande

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *