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

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

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

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

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

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

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

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.

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

$ErrorActionPreference muuttujaKuten 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.,
$ErrorActionPreferencearvo 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.

ErrorAction parametriKä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.,

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

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.

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

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