Adam Automator (Norsk)

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?

Eksempel på feil i PowerShell

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.

Den $Feil variabel er tom

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
feilen er lagt til $Feil variabel

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
Den $Feil objekt egenskaper

for Å fastslå årsaken til feilen, du kan vise innholdet av InvocationInfo egenskap ved å bruke kommandoen nedenfor.,

$Error.InvocationInfo

Den InvocationInfo eiendel

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.

notisblokk prosess detaljer

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.,

Feil blir kastet fordi parameteren er ugyldig

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.

Eksempel på ikke-terminerende feil

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 STOPstyrker 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.,

å Tvinge frem en avslutning feil ved bruk av $ErrorActionPreference variabel

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.

å Tvinge frem en avslutning feil ved bruk av ErrorAction – parameteren

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.,

Skript avsluttet når det har oppstått en feil

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.,

Skriptet avsluttes med en beskrivende feilmelding

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.

du Får feilen TypeName verdi

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.,

Skriptet avsluttes med en bestemt feilmelding

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *