Har du noen gang kjøre et skript eller en PowerShell-cmdlet og bli konfrontert med en skrikende veggen av tekst – rødt – som vist nedenfor?
Feil kan bli overveldende og forvirrende. Og mest av alt, feil er ofte vanskelig å lese, noe som gjør bestemme hva og hvor skriptet som gikk galt i nærheten umulig.,
Heldigvis, har du noen valg i PowerShell for å gjøre dette bedre gjennom håndtering av feil. Ved hjelp av håndtering av feil, feil kan filtreres og vises på en slik måte at det er lettere å få forstand av. Og, forståelse feilen gjør det enkelt å legge til mer logikk for å feilhåndtering.
I denne artikkelen, vil du lære om feil i PowerShell er og hvordan de kan bli fanget opp av andre til å utføre feil håndtering ved hjelp av PowerShell Try Catch
blokker (og finally
blokker).,
Innholdsfortegnelse
Forstå Hvordan Feil Arbeidet i PowerShell
Før du dykker ned i håndtering av feil, la oss først dekke et par konsepter rundt feil i PowerShell. Forståelse feil kan føre til bedre håndtering av feil strategier.
Den $Error Automatisk Variabel
I PowerShell, det finnes en rekke automatiske variabler, og en av dem er $Error
automatisk variabel. PowerShell bruker $Error
variabel til å lagre alle feil som er oppstått i økten., $Error
variabel er en rekke feil sortert etter nyeste.
Når du først åpne en PowerShell-sesjon, $Error
variabel er tom. Du kan sjekke det så ved å ringe $Error
variabel.
Som du kan se, $Error
variabel starter tom., Men, når det genereres en feil, at feil vil bli lagt til, og lagret i $Error
variabel.
I eksempelet nedenfor, feilen er generert ved bevisst å få en tjeneste navn som ikke eksisterer.
PS> Get-Service xyzPS> $ErrorPS> $Error.Count
Som du kan se fra utgang ovenfor, den genererte feil ble lagt til $Error
variabel.,
$Feil variabelen inneholder en samling av feil som genereres i PowerShell-sesjon. Hver feil kan være tilgang ved å ringe sin array position. Den siste feilen vil alltid være i indeks 0.
For eksempel, den siste feilen kan hentes ved hjelp av
$Error
.
Den $Feil Objekt Egenskaper
Siden alt i PowerShell er et objekt, $Error
variabel er et objekt, og objekter har egenskaper., Av rør $Error
variabel til Get-Member
cmdlet, bør du se listen over de eiendommer som er tilgjengelig.
$Error | Get-Member
for Å fastslå årsaken til feilen, du kan vise innholdet av InvocationInfo
egenskap ved å bruke kommandoen nedenfor.,
$Error.InvocationInfo
Nå, kan du gjøre det samme med andre egenskaper og oppdage hva annet du kan finne!
Avslutte Feil
Avslutte feil stanse gjennomføringen flyt når det er oppstått ved PowerShell vs ikke-terminerende feil. Det er flere måter en avslutning feil kan oppstå. Et eksempel er når du ringer til en cmdlet med en parameter som ikke eksisterer.,
Som du vil fra skjermbildet nedenfor, når kommandoen Get-Process notepad
kjører kommandoen er gyldig, og detaljene i notisblokk prosessen er vist.
Men, når en parameter som ikke eksisterer er brukt som Get-Process notepad -handle 251
, cmdleten viser en feilmelding om at handle
parameteren er ikke gyldig. Så, cmdleten kommer ut uten å vise detaljene for det notepad
prosessen.,
Ikke-Terminerende Feil
Ikke-terminerende feil er feil som ikke stopper kjøringen av skriptet eller kommando. For eksempel, sjekk ut den koden nedenfor. Denne koden får listen av fil navn fra fileslist.txt-fil. Deretter skriptet går gjennom hver fil, lese innholdet av hver fil, og sender det på tv.
$file_list = Get-Content .\filelist.txtforeach ($file in $file_list) { Write-Output "Reading file $file" Get-Content $file}
innholdet av filelist.,txt-fil, er fil-navn viser i listen nedenfor.
File_1.logFile_2.logFile_3.logFile_4.logFile_5.logFile_6.logFile_7.logFile_8.logFile_9.logFile_10.log
Men hva hvis File_6.logg faktisk ikke eksisterer? Når du kjører koden, du forventer en feil vil skje fordi skriptet kan ikke finne File_6.logge. Du vil se en lignende produksjon er vist nedenfor.
Som du kan se fra screenshot av resultatet ovenfor, manuset var i stand til å lese de første fem filer i listen, men når det forsøkt å lese filen File_6.,txt, returneres en feil. Skriptet deretter fortsatte å lese resten av filene før du avslutter. Det gjorde ikke avslutte.
Den $ErrorActionPreference Variabel
Så, du har lært om oppsigelse og ikke-terminerende feil og hvordan de skiller seg fra hverandre. Men, visste du at en ikke-terminerende feil kan bli tvunget til å bli behandlet som en avslutning feil?
PowerShell har et konsept som kalles preferanse variabler. Disse variablene brukes til å endre hvordan PowerShell oppfører seg på mange forskjellige måter. En av disse variablene kalles $ErrorActionPreference
.,
$ErrorActionPreference
variabel brukes til å endre måten PowerShell behandler ikke-terminerende feil. Som standard $ErrorActionPreference
verdien er satt til Continue
. Endre verdien for $ErrorActionPreference
variabel til STOP
styrker PowerShell til å behandle alle feil som avslutning feil.
Bruke koden nedenfor til å endre $ErrorActionPreference
verdi.,
$ErrorActionPreference = "STOP"
for Å lære mer om andre gyldig $ErrorActionPreference variabelverdier, kan du gå PowerShell ErrorActionPreference.
Nå, gå tilbake til eksemplet som brukes i Ikke-Terminerende Feil-delen i denne artikkelen. Skriptet kan endres for å inkludere endring i $ErrorActionPreference
liker koden vist nedenfor:
å Kjøre den endrede koden over vil oppføre seg annerledes enn før når $ErrorActionPreference
verdi er satt til standard verdi av Continue
.,
Som du kan se fra screenshot av resultatet ovenfor, manuset var i stand til å lese de første fem filer i listen, men når det forsøkt å lese filen File_6.txt, returneres en feil da filen ble ikke funnet. Deretter skriptet avsluttes, og resten av filene blir ikke lest.,
$ErrorActionPreference
verdi er kun gyldig i det aktuelle PowerShell-sesjon. Det tilbakestilles til standard verdi når en ny PowerShell-sesjon er i gang.
De ErrorAction Vanlige Parameteren
Hvis $ErrorActionPreference
verdi er brukt til PowerShell-sesjon, ErrorAction
parameteren gjelder til en cmdlet som støtter vanlige parametere. ErrorAction
parameter aksepterer de samme verdier som $ErrorActionPreference
variabel gjør.,
ErrorAction
parameter verdi forrang over $ErrorActionPreference
verdi.
La oss gå tilbake og bruk den samme koden som i forrige eksempel. Men, denne gangen, ErrorAction
parameter er lagt til Get-Content
line.
Etter å ha kjørt den endrede koden, vil du se at selv om $ErrorActionPreference
er satt til Continue
skriptet fortsatt avsluttet når det oppstod en feil., Skriptet avsluttes fordi -ErrorAction
parameter verdi i Get-Content
er satt til STOP
.
ved Hjelp av PowerShell Prøve å Fange Blokker
På dette punktet, du har lært om PowerShell feil og hvordan $ErrorActionPreference
variabel og ErrorAction
parametere arbeid., Nå er det på tide du lærer om de gode ting – PowerShell Try Catch Finally
blokker.
PowerShell try catch
blokker (og valgfritt finally block
) er en måte å kaste en netto rundt et stykke kode og fange opp eventuelle feil som returnerer.
– koden nedenfor viser syntaks for Try
uttalelse.
try { <statement list>}catch *]{ <statement list>}finally { <statement list>}
Try
blokk inneholder koden som du vil PowerShell til å «prøve» og overvåke for feil., Hvis koden i Try
blokker oppdager en feil, feil er lagt til $Error
variabel, og deretter gikk til Catch
blokker.
Catch
blokker inneholder handlinger som skal utføres når den mottar en feilmelding fra Try
blokker. Det kan være flere Catch
blokker i en Try
uttalelse.
Finally
blokker som inneholder kode som på slutten av Try
uttalelse., Denne blokken går om eller ikke en feil var utallige.
Fanger Ikke-Spesifikke Feil (Catch-All)
En enkel Try
erklæringen inneholder en Try
og Catch
blokker. Finally
blokker er valgfritt.
For eksempel, for å fange en ikke-spesifikke unntak, Catch
parameteren bør være tom. Eksempelet koden nedenfor er ved hjelp av det samme skriptet som ble brukt i Den $ErrorActionPreference Variable delen, men modifisert for å bruke Try Catch
blokker.,
Som du kan se fra koden nedenfor på denne tiden, foreach
uttalelse er vedlagt inne Try
blokker. Så, en Catch
blokker inneholder koden for å vise string An Error Occurred
hvis du får en feilmelding som skjedde. Koden i Finally
blokker bare fjerner $Error
variabel.
koden over, etter å ha kjørt i PowerShell, vil gi deg denne utgangen vist nedenfor.,
output ovenfor viser at skriptet oppstod en feil, kjørte koden i Catch
blokkere, og deretter avsluttes.
feil ble håndtert, som var utgangspunktet for håndtering av feil. Men feilen viste var for generisk. For å vise et mer beskrivende feilmelding, kan du få tilgang til Exception
egenskap av feilen som ble vedtatt av Try
blokker.,
– koden nedenfor er endret, spesielt koden i Catch
blokker, for å vise unntak melding fra gjeldende feil som var gått ned rørledningen – $PSItem.Exception.Message
Denne gangen, når den endrede koden ovenfor er kjørt, meldingen som vises er mye mer beskrivende.,
Fange Spesifikke Feil
Det er tider når en catch-all håndtering av feil er ikke den mest hensiktsmessige tilnærmingen. Kanskje du ønsker at skriptet skal utføre en handling som er avhengig av feil som er oppstått.
Hvordan kan du bestemme feil type? Ved å kontrollere TypeName
verdi Exception
eiendom for den siste feilen., For eksempel, for å finne feil type fra forrige eksempel, kan du bruke denne kommandoen:
$Error.Exception | Get-Member
resultatet av koden ovenfor ville se ut som på skjermbildet under. Som du kan se, TypeName
verdi vises – System.Management.Automation.ItemNotFoundException
.
Nå som du vet det feil type som du trenger for å fange opp, endre koden for å fange det som er spesielt., Som du ser fra den endrede koden under for, det er nå to Catch
blokker. Den første Catch
blokker avskjærer en bestemt type feil (System.Management.Automation.ItemNotFoundException
). I kontrast, den andre Catch
blokk inneholder generisk, catch-all feilmelding.
skjermbildet nedenfor viser resultatet av den endrede koden ovenfor.,
Konklusjon
I denne artikkelen, du har lært om feil i PowerShell, sine egenskaper, og hvordan du kan finne ut en feil er bestemt type. Du har også lært forskjellen mellom hvordan $ErrorActionPreference
variabel, og ErrorAction
parameter som påvirker hvordan PowerShell behandler ikke-terminerende feil.,
Du har også lært hvordan bruke PowerShell Try Catch Finally
blokker for å utføre håndtering av feil, enten for spesifikke feil eller en catch-all tilnærming.
De eksempler som er vist i denne artikkelen viser bare det grunnleggende om hvordan Try Catch Finally
blokker arbeid. Den kunnskap som jeg håper du har fått i denne artikkelen skal gi deg startblokkene for å begynne å bruke håndtering av feil i dine skript.,
Mer å Lese
- About_Try_Catch_Finally
- About_Automatic_Variables
- Tilbake til det Grunnleggende: PowerShell foreach Loop
- Tilbake til det Grunnleggende: Forstå PowerShell Objekter