En af de vigtigste dele af enhver god PowerShell script er håndtering af fejl. Selv i det korteste script er det at være i stand til at håndtere fejl med til at sikre, at en uventet begivenhed ikke fortsætter med at ødelægge det system, du arbejder på. Tag eksemplet nedenfor. Hver uge i vores prøvefirma (MyCompany.Com) menneskelige ressourcer skal uploade en liste, der fortæller os, hvem der skal have adgang til Udgiftsdatabasen., Hvis et navn ikke er på listen fra HR, fjerner vi det fra gruppen, og den bruger vil ikke længere være i stand til at logge udgiftskrav:
nu kan du se, hvor dette vil gå galt. En uges HR kommer ikke rundt for at uploade listen, eller ligesom vi er ved at få adgang til listen, dør filserveren. Pludselig kaster Po .ershell en fejl på Get-Content cmdlet, og $Authori .eduser-variablen forbliver tom. Fordi vores script ikke håndterer fejl, fortsætter det med at køre, og på meget kort tid har det fjernet alle brugere fra vores udgiftsgruppe., Temmelig snart begynder de vrede telefonopkald at oversvømme, og livet bliver lidt mindre lykkeligt. Måden at undgå alt dette er at fange fejlene og derefter håndtere den begivenhed, der forårsagede dem (som i dette tilfælde stopper scriptet og har et råb på nogen i HR).
afslutnings-og ikke-Afslutningsfejl
en af de vigtigste ting, man skal vide, når man fanger fejl, er, at kun visse fejl kan fanges som standard. Fejl findes i to typer – afslutning og ikke-afslutning. En afslutningsfejl er en fejl, der stopper en funktion eller operation., Hvis du laver en syntaksfejl eller løber tør for hukommelse, er det en afslutningsfejl. Afslutning fejl kan fanges og håndteres. Ikke-terminerende fejl tillader Po .ershell at fortsætte og kommer normalt fra cmdlets eller andre administrerede situationer. Under normale omstændigheder kan de ikke fanges af Try-Catch-endelig. Get-Content-fejlen i eksemplet ovenfor er en ikke-afslutningsfejl.
behandling af ikke-terminerende fejl som afslutning
så hvordan får du en ikke-terminerende fejl? Grundlæggende beder du Po .ershell om at behandle det som afslutning. For at gøre dette bruger du parameteren ErrorAction., Hver Po .ershell cmdlet understøtter Fejlhandling. Ved at angive-ErrorAction Stop på enden af en cmdlet sikrer du, at eventuelle fejl det kaster behandles som afslutning og kan blive fanget. I vores eksempel ovenfor, vi kommer til at ændre vores Get-Content-line til:
$AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop
at Behandle Alle Fejl som Afslutning
Det er også muligt at behandle alle de fejl, som afslutning hjælp ErrorActionPreference variabel. Du kan gøre dette enten for det script, du arbejder med, eller for hele Po .ershell-sessionen. For at indstille det i et script skal du lave den første linje $ErrorActionPreference = Stop., For at indstille den til sessionen skal du skrive $ErrorActionPreference = Stop ved Po .ershell-konsollen.
at Fange en Afslutning Fejl
Når du har sikret, at den fejl, du forsøger at fange vil blive behandlet som afslutning, kan du bygge en Try, Catch blok omkring den kommando (eller kommandoer), der kan forårsage fejl. Den første fase er at omgive den del af dit script, der kan kaste fejlen med en prøve blok. I vores eksempel bliver Get-Content-linjen:
Try{ $AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop}
umiddelbart efter prøveblokken skal du placere en Fangstblok for at håndtere fejlen., Fangstblokken er kun tilgængelig, hvis der opstår en afslutningsfejl, ellers ignoreres den. I vores eksempel vil vi e-maile en administrator for at sige, at der har været en fejl og derefter stoppe scriptet. Vores Get-Content-linje er nu:
adgang til Fejloptegnelsen
Når du er inde i en fangstblok, kan du få adgang til fejloptegnelsen, som er gemt i den aktuelle Objektvariabel $_. Fejlregistreringer har forskellige nyttige egenskaber, men den vigtigste, du vil have adgang til, er$_.Undtagelse., Undtagelser er det, vi virkelig har at gøre med her, når vi fanger og håndterer fejl – undtagelser er den uventede begivenhed, der forårsagede fejlen (selve fejloptegnelsen er faktisk kun en indpakning til at præsentere undtagelsen for Po .ershell-brugeren). Det er den undtagelse, vi fanger, og den undtagelse, der indeholder alle de virkelig nyttige oplysninger om problemet. Hvis der var et yderligere underliggende problem, der forårsagede vores undtagelse, registreres det også på$_.undtagelse.innereeptionception (og så videre – den næste underliggende undtagelse gemmes på $_.undtagelse.innerecception.,innereeptionception osv.). Med henblik på vores eksempel vil vi bruge $_.Undtagelse at sætte nogle ekstra oplysninger i vores anmeldelse e-mail, ved hjælp af $_.Undtagelse.Besked og$_.Undtagelse.Egenskaber for Varenavn:
fangst af specifikke undtagelser
nu, som vores eksempel står, fanger vi eventuelle fejl, der opstår under filen, der læses og håndterer dem alle på samme måde. Du kan dog fange specifikke undtagelser og håndtere dem forskelligt, men – Og det er en stor, men – kun hvis den oprindelige fejl afsluttes., Fordi Get-Content cmdlet kaster ikke-terminerende fejl (som vi kun har behandlet som afslutning ved hjælp af fejl), kan vi ikke specifikt fange de forskellige undtagelser, som cmdlet måtte kaste. Dette er en funktion i Po .ershell og gælder for enhver ikke-terminerende fejl, uanset ErrorActionPreference og kan ikke ændres. Vi kan stadig håndtere andre afsluttende undtagelser, såsom en fejl i hukommelsen, der kan dukke op under læsningsoperationen. Med henblik på dette eksempel er det, hvad vi vil gøre.,
du fanger specifikke afslutningsfejl ved at angive undtagelsesnavnet umiddelbart efter Fangstsøgeordet. I vores eksempel ønsker vi at fange et System.OutOfMemory undtagelse og, hvis vi får en, vil tage ingen nonsens tilgang genstarte computeren med det samme. Vi vil også omfatte en generel catch-blok, efter vores fil ikke fundet blok for at fange alle andre undtagelser:
Endelig, ved Hjælp af Endelig
Den sidste del af Forsøge at Fange Endelig er Endelig blok. Dette skal defineres umiddelbart efter Fangstblokken og kører hver gang, uanset om der var en fejl eller ej., På denne måde kan du udføre handlinger, der skal foretages, uanset om en operation lykkes eller mislykkes. I vores eksempel vil vi logge på, at en læst fil blev forsøgt. Vores Get-indhold linje ser nu ud: