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