Yksi tärkeimmistä osista mitään hyvää PowerShell script on virheiden käsittely. Vaikka lyhin kirjoitus, on pystyttävä käsittelemään virheitä auttaa varmistamaan, että odottamaton tapahtuma ei mennä pilaamaan järjestelmän olet työskennellyt. Ota esimerkki alla. Joka viikko meidän näyte yritys (MyCompany.Com) Inhimilliset Voimavarat ovat menossa lähettää lista kertoo meille, kuka on pääsy Kulut tietokantaan., Jos nimeä ei ole luettelossa, HR aiomme poistaa ryhmästä, ja että käyttäjä ei voi enää kirjautua korvaushakemukset:
Nyt voit nähdä, mihin tämä on menossa mennä pieleen. Viikon HR ei pääse lataamaan listaa tai juuri kun olemme pääsemässä listalle, tiedostopalvelin kuolee. Yhtäkkiä PowerShell heittää virheen Get-Content cmdlet ja $AuthorizedUser muuttuja jää tyhjäksi. Koska kirjoitus ei käsittele virheitä, se toimii edelleen, ja hyvin lyhyessä ajassa, se on poistettu, jokainen käyttäjä meidän kulut-ryhmässä., Melko pian raivostuneet puhelinsoitot alkavat tulvia sisään ja elämä alkaa olla vähän vähemmän onnellista. Tapa välttää kaikki tämä on kiinni virheet ja sitten käsitellä tapahtumaa, joka on aiheuttanut heille (joka tässä tapauksessa on pysäyttää käsikirjoitus ja huutaa joku HR).
Päättämisestä ja Ei-Päättämisestä Virheitä
Yksi tärkeimmistä asioista tietää, milloin kiinni virheitä on se, että vain tiettyjä virheitä voi olla kiinni oletuksena. Virheitä tulee kahta tyyppiä-päättämistä ja ei-päättämistä. Päättymisvirhe on virhe, joka pysäyttää toiminnon tai toiminnan., Jos teet syntaksivirheen tai muisti loppuu, se on päättävä virhe. Lopettamisvirheet voidaan ottaa kiinni ja hoitaa. Päättymättömät virheet mahdollistavat PowerShellin jatkumisen ja tulevat yleensä cmdletsistä tai muista hoidetuista tilanteista. Normaalioloissa niitä ei voi saada kiinni Try-Catch-lopulta. Yllä olevan esimerkin Get-Content-virhe on päättymätön virhe.
Hoitoon Ei-Päättämisestä Virheet, kuten Päättämisestä
Joten miten voit saalis Ei-Päättämisestä virhe? Periaatteessa käsket Powershellia pitämään sitä päättävänä. Voit tehdä tämän käyttämällä ErrorAction parametri., Jokainen PowerShell cmdlet tukee ErrorAction. Määrittelemällä-ErrorAction Stop lopussa cmdlet varmistat, että kaikki virheet, joita se heittää käsitellään päättyminen ja voidaan kiinni. Tässä esimerkissä aiomme muuttaa meidän Get-Sisältöä rivi:
$AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop
Kohtelee Kaikkia Virheitä Päättämisestä
Se on myös mahdollista hoitaa kaikki virheet päättämisestä käyttää ErrorActionPreference muuttuja. Voit tehdä tämän joko käsikirjoitus on työskennellyt tai koko PowerShell-istunto. Aseta se komentosarjaan, tee ensimmäinen rivi $ErrorActionPreference = Stop., Voit asettaa sen istuntoon kirjoittamalla $ErrorActionPreference = pysähdy PowerShell-konsoliin.
Kiinni Päättämisestä Virhe
Kun olet varmistanut, että virhe yrität saalis on menossa pidettävä päättämisestä, voit rakentaa Yrittää Saalis korttelin ympäri-komento (tai käskee), jotka saattavat aiheuttaa virheen. Ensimmäinen vaihe on ympäröidä osa skripti, joka voi heittää virhe kokeilla lohko. Tässä esimerkissä Get-Sisältöä linja tulee:
Try{ $AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop}
Heti Yrittää estää sinun täytyy asettaa Catch käsitellä virhe., Saalislohkoon pääsee vain, jos tapahtuu päättymisvirhe, muuten se jätetään huomiotta. Esimerkissämme aiomme lähettää admin sanoa, että on tapahtunut virhe ja sitten pysäyttää käsikirjoituksen. Meidän Get-Sisältöä rivi on nyt:
Accessing Virhe Ennätys
Kun olet sisällä catch voit käyttää virhe ennätys, joka on tallennettu nykyisen objektin muuttuja, $_. Virhetiedoilla on erilaisia hyödyllisiä ominaisuuksia, mutta tärkein, johon haluat käyttää, on $_.Poikkeus., Poikkeuksia ovat, mitä olemme todella tekemisissä kuin me kiinni ja käsitellä virheitä, poikkeuksia on odottamaton tapahtuma, joka aiheutti virheen (virhe ennätys itsessään on oikeastaan vain todella kääre esittelee ottamatta PowerShell-käyttäjä). Poikkeuksena on, että olemme kiinni ja poikkeus, joka sisältää kaikki todella hyödyllistä tietoa ongelma. Jos oli toinen taustalla ongelma, joka aiheutti meidän poikkeus, se on myös kirjattu$_.poikkeus.innerexception (ja niin edelleen – seuraava taustalla oleva poikkeus tallennetaan $_.poikkeus.harhakäsitys.,innerexception jne.). Tarkoituksiin esimerkkimme aiomme käyttää$_.Poikkeus laittaa joitakin lisätietoja meidän ilmoitus sähköposti, käyttämällä$_.Poikkeus.Viesti ja$_.Poikkeus.ItemName ominaisuudet:
Kiinni Tiettyjä Poikkeuksia
Nyt, kuten esimerkissä seisoo olemme kiinni kaikki virheet, jotka tapahtuvat aikana tiedosto lukea ja käsitellä niitä kaikkia samalla tavalla. Voit kuitenkin kiinni erityisiä poikkeuksia ja käsitellä niitä eri tavalla, mutta – ja tämä on iso mutta – vain, jos alkuperäinen virhe on päättämisestä., Koska Saada-Sisältöä cmdlet heittää ei-päättämisestä virheitä (että meillä on vain käsitelty päättämisestä käyttäen ErrorAction) emme voi erityisesti saalis erilaisia poikkeuksia, että cmdlet-komento saattaa heittää. Tämä on PowerShellin ominaisuus ja koskee mitä tahansa päättymätöntä virhettä, riippumatta Erroractionpreferencesta, eikä sitä voida muuttaa. Voimme silti käsitellä muita päättäviä poikkeuksia, kuten muistivirheen poistumista, jotka voisivat ilmaantua lukuoperaation aikana. Tässä esimerkissä teemme näin.,
Olet kiinni erityinen päättämisestä virheet määrittämällä poikkeus nimi heti Catch avainsana. Esimerkissämme haluamme napata järjestelmän.OutOfMemory poikkeus ja, jos saamme yhden, ottaa no nonsense lähestymistapa uudelleenkäynnistystä tietokone välittömästi. Meidän on myös sisällytettävä yleinen catch-lohkossa, kun meidän tiedostoa ei löydy lohko kiinni kaikki muut poikkeukset:
Lopuksi, Käyttämällä Lopuksi
viimeinen osa Yrittää Saalis Lopuksi on Vihdoin lohko. Tämä on määriteltävä heti Catch ja toimii joka kerta, riippumatta siitä, onko siellä oli virhe tai ei., Näin voit suorittaa toimia, jotka on tehtävä riippumatta siitä, onko toiminta onnistuu tai epäonnistuu. Esimerkissämme aiomme kirjautua, että tiedosto luettu yritettiin. Get-Content line näyttää nyt: