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?
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
.
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
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
for At fastslå årsagen til fejlen, du kan se indholdet af InvocationInfo
ejendom ved hjælp af kommandoen nedenfor.,
$Error.InvocationInfo
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.
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.,
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.
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 STOP
tvinger 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
.,
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 $ErrorActionPreference
er 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
.
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 foreach
sæ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.,
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.,
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
.
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.,
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