Adam Automator (Suomi)

oletko koskaan suorittaa komentosarjan tai PowerShell-cmdlet-komentoa ja saada kohtaamaan huutaa wall of text – punainen – kuten kuvassa alla?

Esimerkki virheitä PowerShell

– Virheet voi tulla ylivoimainen ja sekava. Ja ennen kaikkea virheet ovat usein vaikeasti luettavia, mikä tekee siitä, mikä ja missä käsikirjoitus meni pieleen lähes mahdottomaksi.,

onneksi sinulla on joitakin PowerShell-vaihtoehtoja, jotta tämä olisi parempi virheenkäsittelyllä. Virheiden käsittelyn avulla virheet voidaan suodattaa ja näyttää siten, että ne on helpompi ymmärtää. Ja virheen ymmärtäminen tekee virheenkäsittelyyn helposti lisää logiikkaa.

tässä artikkelissa, opit virheitä PowerShell ja miten ne voidaan siepata suorittaa virheiden käsittely käyttäen PowerShell Try Catch lohkojen (ja finally blocks).,

Sisällysluettelo

Ymmärtää, Miten Virheet Työskennellä PowerShell

Ennen kuin sukellat virheiden käsittelyä, katsotaanpa ensin kattaa muutamia käsitteitä ympäri virheitä PowerShell. Virheiden ymmärtäminen voi johtaa parempaan virheenkäsittelystrategiaan.

Dollaria Virhe Automaattinen Muuttuja

PowerShell, on olemassa paljon automaattisia muuttujia, ja yksi niistä on $Error automaattinen muuttuja. PowerShell käyttää $Error – muuttujaa tallentaakseen kaikki istunnossa havaitut virheet., $Error muuttuja on joukko viimeisimpien mukaan lajiteltuja virheitä.

Kun ensin avata PowerShell-istunto, $Error muuttuja on tyhjä. Voit tarkistaa sen soittamalla$Error muuttujaan.

Dollaria Virhe muuttuja on tyhjä

Kuten voit nähdä, $Error muuttuja alkaa pois tyhjä., Mutta kun virhe syntyy, virhe lisätään ja tallennetaan $Error muuttujaan.

alla olevassa esimerkissä, virhe syntyy tarkoituksella saada palvelun nimi, jota ei ole olemassa.

PS> Get-Service xyzPS> $ErrorPS> $Error.Count
virhe on lisätty $Virhe muuttuja

Kuten voit nähdä lähtö edellä, syntyy virhe lisättiin $Error muuttuja.,

$Virhe muuttuja sisältää kokoelman virheitä syntyy PowerShell-istunto. Jokainen virhe voidaan käyttää soittamalla sen array asema. Viimeisin virhe on aina indeksissä 0.

esimerkiksi, viimeisin virhe voi palauttaa käyttämällä $Error.

Dollaria Virhe Objektin Ominaisuudet

Koska kaikki PowerShell on esine, $Error muuttuja on esine, ja esineitä on ominaisuuksia., Putkiston $Error muuttuja Get-Member cmdlet-komentoa, sinun pitäisi nähdä lista ominaisuuksia saatavilla.

$Error | Get-Member
Dollaria Virhe objektin ominaisuudet

määrittää virheen syy, voit tarkastella sisältöä InvocationInfo omaisuus komennolla alla.,

$Error.InvocationInfo

The InvocationInfo omaisuutta

Nyt voit tehdä saman muita ominaisuuksia ja selvittää, mitä muuta voit löytää!

Päättämisestä Virheitä

Päättämisestä virheitä lopeta suorituksen kulku, kun se on kohtaamista PowerShell vs ei-päättämisestä virheitä. On olemassa useita tapoja lopettaa virhe voi tapahtua. Yksi esimerkki on, kun kutsutaan cmdlet parametri, joka ei ole olemassa.,

Kuten näette kuvakaappaus alla, kun komento Get-Process notepad toimii, komento on voimassa, ja yksityiskohdat notepad prosessi on näkyvissä.

notepad prosessin yksityiskohtia

Mutta, kun parametri, joka ei ole olemassa, käytetään kuten Get-Process notepad -handle 251, cmdlet-komento näyttää virheilmoituksen, että handle parametri ei ole voimassa. Sitten cmdlet poistuu näyttämättä yksityiskohtia notepad – prosessista.,

Virhe on heitetty, koska parametri on virheellinen.

Ei-Päättämisestä Virheitä

Ei-päättämisestä virheet ovat virheitä, jotka eivät lopeta suorittamisen käsikirjoituksen tai komento. Katso esimerkiksi alla oleva koodi. Tämä koodi saa luettelon tiedostonimistä tiedostolistalta.txt-tiedosto. Sitten, skripti menee läpi kunkin tiedoston nimi, lukea sisällön kunkin tiedoston, ja ulostulot sen ruudulla.

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

sisältö tiedostoluettelo.,txt-tiedosto ovat alla olevassa luettelossa näkyvät tiedostonimet.

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

mutta entä jos File_6.eikö lokia ollut olemassa? Koodia ajettaessa odottaisi virheen tapahtuvan, koska skripti ei löydä Tiedostoa_6.kirjaudu. Näet, samanlainen lähtö alla.

Esimerkki ei-päättämisestä virhe

Kuten voitte nähdä kuvakaappaus tulos edellä, käsikirjoitus oli lukea viisi ensimmäistä tiedostot luettelossa, mutta kun se on yrittänyt lukea tiedoston File_6.,txt, virhe palautetaan. Tämän jälkeen skripti jatkoi muiden tiedostojen lukemista ennen poistumistaan. Se ei päättynyt.

Dollaria ErrorActionPreference Muuttuja

tähän asti olet oppinut, siitä päättämisestä ja ei-päättämisestä virheitä ja miten ne eroavat toisistaan. Mutta, tiesitkö, että ei-päättävä virhe voidaan pakottaa käsittelemään päättävä virhe?

Powershellissa on käsite nimeltä preference-muuttujat. Näitä muuttujia käytetään muuttamaan sitä, miten PowerShell käyttäytyy monella eri tavalla. Yksi näistä muuttujista on nimeltään $ErrorActionPreference.,

$ErrorActionPreference muuttuja on tapana muuttaa PowerShell kohtelee ei-päättämisestä virheitä. Oletuksena $ErrorActionPreference arvoksi Continue. Muuttamalla arvo $ErrorActionPreference muuttuja STOPvoimat PowerShell kohdella kaikkia virheitä päättämisestä virheitä.

käytä alla olevaa koodia $ErrorActionPreference arvon muuttamiseen.,

$ErrorActionPreference = "STOP"

oppia lisää muita voimassa $ErrorActionPreference muuttujan arvoja, käy PowerShell ErrorActionPreference.

Nyt, katso takaisin esimerkiksi käyttää Ei-Päättämisestä Virheet-osiossa tämän artikkelin. Käsikirjoitusta voidaan muokata sisältämään muutos $ErrorActionPreference kuten koodi alla:

Käynnissä muokattu koodi edellä käyttäytyvät eri tavalla kuin ennen, kun $ErrorActionPreference arvoksi on asetettu oletusarvo Continue.,

Pakottaa päättämisestä virhe käyttämällä $ErrorActionPreference muuttuja

Kuten voitte nähdä kuvakaappaus tulos edellä, käsikirjoitus oli lukea viisi ensimmäistä tiedostot luettelossa, mutta kun se on yrittänyt lukea tiedoston File_6.txt, virhe palautetaan, koska tiedostoa ei löytynyt. Sitten skripti lopetettiin, ja loput tiedostot eivät lueta.,

$ErrorActionPreference arvo on voimassa vain nykyisessä PowerShell-istunto. Se palautuu oletusarvoon, kun uusi PowerShell-istunto on käynnistetty.

Myös ErrorAction Yhteinen Parametri

– Jos $ErrorActionPreference arvoa käytetään PowerShell-istunto, ErrorAction parametri koskee kaikkia cmdlet-komento, joka tukee yhteisiä parametreja. ErrorAction parametri hyväksyy samat arvot, että $ErrorActionPreference muuttuja ei.,

ErrorAction parametrin arvo on etusijalla $ErrorActionPreference arvo.

palataan takaisin ja käytetään samaa koodia edellisessä esimerkissä. Mutta, tällä kertaa, ErrorAction parametri lisätään Get-Content rivi.

Kun käynnissä muutettu koodi, näet, että vaikka $ErrorActionPreference on asetettu Continue, käsikirjoitus vielä päättynyt, kun se kohtasi virheen., Käsikirjoitus lopettaa, koska -ErrorAction parametrin arvo Get-Content on asetettu STOP.

Pakottaa päättämisestä virhe käyttämällä ErrorAction parametri

Käyttämällä PowerShell Yrittää Saalis Lohkot

tässä vaiheessa, olet oppinut PowerShell virheitä ja miten $ErrorActionPreference muuttuja ja ErrorAction parametrit työtä., Nyt on aika oppia hyvistä jutuista-PowerShell Try Catch Finally lohkot.

PowerShell try catch lohkojen (ja valinnainen finally block) ovat tapa heittää net noin koodinpätkä ja kiinni kaikki virheet, jotka palauttavat.

alla Oleva koodi osoittaa, syntaksin Try lausunto.

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

Try lohko sisältää koodin, jonka haluat PowerShell ”kokeilla” ja seurata virheitä., Jos koodi Try lohko kohtaa virheen, virhe on lisätty $Error muuttuja ja sitten siirtynyt Catch lohko.

Catch lohko sisältää toimet suoritetaan, kun se saa virheilmoituksen Try lohko. Ei voi olla useita Catch lohkot Try lausunto.

Finally lohko sisältää koodia, joka lopussa Try lausunto., Tämä lohko kulkee riippumatta siitä, oliko virhe laskematta.

Kiinni Ei-Erityisiä Virheitä (Catch-All)

yksinkertainen Try selvitys sisältää Try ja Catch lohko. Finally lohko on valinnainen.

esimerkiksi, kiinni ei-erityinen poikkeus, Catch parametri pitäisi olla tyhjä. Esimerkiksi alla oleva koodi käyttää samaa käsikirjoitusta, jota käytettiin Dollaria ErrorActionPreference Muuttuva osa, mutta muunnettu käyttämään Try Catch lohkot.,

Kuten voit nähdä alla oleva koodi, tällä kertaa foreach lausunto on suljettu sisälle Try lohko. Sitten, Catch lohko sisältää koodin näyttö merkkijono An Error Occurred, jos virhe tapahtui. Koodi Finally lohko vain poistaa $Error muuttuja.

yllä oleva koodi, kun olet suorittanut Powershellissa, antaa sinulle tämän tuotoksen alla.,

Script päättynyt, kun on tapahtunut virhe

lähtö edellä osoittaa, että käsikirjoitus havainnut virheen, juoksi koodin sisälle Catch lohko, ja sitten lopettaa.

virhe hoidettiin, mikä oli virheenkäsittelyn piste. Näytetty virhe oli kuitenkin liian yleinen. Näyttää kuvaavampi virhe, voit käyttää Exception omaisuutta virhe, joka oli ohi Try lohko.,

alla Oleva koodi on muutettu, erityisesti koodin sisälle Catch lohko, näyttää poikkeus viestin nykyisestä virhe, joka oli periytynyt putki – $PSItem.Exception.Message

Tällä kertaa, kun muutettu koodi edellä on ajaa, viesti näkyy on paljon kuvaavampi.,

Script lopetettiin kuvaava virheilmoitus

Kiinni Erityisiä Virheitä

On aikoja, jolloin catch-all virheiden käsittely ei ole sopivin lähestymistapa. Ehkä haluat, että skriptisi suorittaa toiminnon, joka riippuu siitä, minkä tyyppinen virhe kohdataan.

miten määrität virhetyypin? Tarkistamalla TypeName arvo Exception omaisuutta viimeinen virhe., Esimerkiksi, löytää virheen tyyppi edellisestä esimerkiksi, käytä tätä komentoa:

$Error.Exception | Get-Member

tulosta yllä oleva koodi näyttää kuvakaappaus alla. Kuten näette, TypeName arvo näkyy – System.Management.Automation.ItemNotFoundException.

Saada virheen TypeName-arvo

Nyt kun tiedät virhe tyyppi, että sinun täytyy kuunnella, muokata koodia kiinni sitä erityisesti., Kuten alla olevasta muutetusta koodista näkyy, on nyt kaksi Catch – lohkoa. Ensimmäinen Catch lohko sieppaa tietyn tyypin virhe (System.Management.Automation.ItemNotFoundException). Sen sijaan toinen Catch lohko sisältää yleisiä, catch-all virheilmoituksen.

alla oleva kuvakaappaus näyttää yllä olevan muokatun koodin ulostulon.,

Script lopetettiin erityinen virheilmoitus

Johtopäätös

tässä artikkelissa, olet oppinut virheitä PowerShell, sen ominaisuudet, ja miten voit määrittää, virhe on erityinen tyyppi. Olet myös oppinut, mitä eroa $ErrorActionPreference muuttuja ja ErrorAction parametri vaikuttaa siihen, miten PowerShell kohtelee ei-päättämisestä virheitä.,

Sinulla on myös oppinut, miten käyttää PowerShell Try Catch Finally lohkojen suorittaa virheiden käsittelyä, onko tiettyjä virheitä tai kiinni-kaikki lähestymistapa.

tässä artikkelissa esitetyt esimerkit osoittavat vain sen, miten Try Catch Finally lohkot toimivat. Tieto, että toivon olet saanut tässä artikkelissa pitäisi antaa sinulle alkulohkot alkaa soveltaa virheenkäsittely teidän skriptejä.,

kirjallisuutta

  • About_Try_Catch_Finally
  • About_Automatic_Variables
  • Takaisin Perusasioihin: PowerShell-foreach Silmukka
  • Takaisin Perusasioihin: Ymmärtää PowerShell-Esineet

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *