Kuten nimestä käy ilmi, PowerShell on paljon tehokkaampi kuin Windowsin tavallinen komentokehote. Tämän tehon myötä on suurempi mahdollisuus hämmentäviin virheisiin. Jos komentosarjasi yhtäkkiä epäonnistuu, et ehkä tiedä, mistä lähteä etsimään, mikä meni pieleen. Tässä kohtaa PowerShellin virheenkäsittely on kätevä.
Jos olet perehtynyt muihin kieliin, tiedät luultavasti virheenkäsittelyn perusteet, mutta on joitakin PowerShellille ominaisia näkökohtia, jotka sinun on tiedettävä. PowerShellin virheenkäsittelyssä on neljä osaa: Error Action -parametri, Try/Catch-lohkot, Error Variable -parametri ja lokitus.
PowerShell-virheiden käsittely helposti
Ensimmäinen askel PowerShell-virheiden käsittelyssä on käsitellä jotain, joka pysäyttää skriptisi. Jos virhe ei vaikuta skriptisi muuhun osaan, voi olla parasta vain käskeä PowerShelliä jättämään virheet huomiotta ja jatkaa eteenpäin.
Toisaalta ei ole aina selvää, milloin tietty cmdlet heittää lopettavan virheen. Jotkin cmdletit palauttavat virheen, mutta eivät pysäytä komentosarjaa. Tällöin voit joutua odottamaan komentosarjan päättymistä samalla, kun se tuottaa hölynpölyä.
Tässä kohtaa -ErrorAction-parametri tulee kuvaan mukaan. Sen avulla voit pakottaa cmdletin käsittelemään virheen haluamallasi tavalla. Jos muokkaat olemassa olevaa komentosarjaa, liität sen komentorivin loppuun.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Stop
On selvää, että jos käytät Get-ChildItem-komentokomentokehotetta sellaisenaan, tästä virheestä ei ole paljon hyötyä. Jos kuitenkin haluat tehdä tiedoilla jotain, olisi hyvä pysäyttää komentosarja, jotta tiedät, että haku epäonnistui ja miksi. Vaihtoehtoisesti, jos teet useita hakuja, vaihda parametri Stopista SilentlyContinue-parametriksi, jotta komentosarja jatkuu, jos haku epäonnistuu. Jos haluat nähdä virheen, voit sen sijaan käyttää parametrina Continue.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction SilentlyContinue
Jos haluat mieluummin kontrolloida, mitä tapahtuu joka kerta, kun komentosarja suoritetaan, voit vaihtaa parametriksi Inquire. Kun cmdletisi kohtaa ongelman, se antaa vaihtoehtoja: Yes (Kyllä), Yes For All (Kyllä kaikille), Halt Command (Pysäytä komento), Suspend (Keskeytä) tai Help (Ohje).
Tämä vaihtoehto on hieman joustavampi, mutta se tarkoittaa, että virheet aiheuttavat sen, että komentosarjasi odottaa syötettäsi. Se sopii hyvin, jos käytät PowerShelliä sähköpostin lähettämiseen tai muuhun yksinkertaiseen tehtävään, mutta et ehkä halua sitä, kun käytät pitkää prosessia yön yli.
PowerShellin virheiden käsittely tehokkaalla tavalla
ErrorAction-parametrin avulla virheet käsitellään mutkattomasti. Jos kuitenkin kaipaat hiukan enemmän kontrollia virheiden käsittelyyn, PowerShellillä on silti varaa. Try/Catchin avulla voimme nyt haarukoida skriptin, kun komentokomennot palauttavat virheen.
Try/Catch koostuu nimensä mukaisesti kahdesta osasta. (Teknisesti on olemassa kolmaskin osa, mutta siihen palataan hetken kuluttua.) Ensimmäinen on Try-osa. Tässä osiossa suoritat normaalin koodisi. Käytät edelleen -ErrorAction-parametria, mutta sen arvoksi voidaan asettaa vain Stop. Tämä lippu varmistaa, että komentosarjasi käynnistää Catch-toiminnon, vaikka siinä ei olisi lopettavaa virhettä.
Try{
Get-Process "Cortana" -ErrorAction Stop
}
Try voi myös estää muiden komentosarjojen suorittamisen, jos haku epäonnistuu. Tässä tapauksessa, jos lähetit Get-Process-tulokset Stop-Processille, epäonnistunut haku estää toisen cmdletin suorittamisen.
Nyt kun olet luonut try-cmdlet-lohkon, mitä haluat tehdä, kun se epäonnistuu? Käyttämällä Catch-puolta määrittelet tämän.
Catch{
Write-Host "Process Not Found"
}
Kuten ErrorAction-parametrin kohdalla, Catch on hyödyllinen muuhunkin kuin pelkän epäonnistumisen antamiseen, varsinkin kun teet jotain hieman monimutkaisempaa. (Yllä olevassa esimerkissä epäonnistuminen pakotetaan käyttämällä sovelluksen nimeä eikä prosessin nimeä). Varmista siis, että leikit Try-lohkolla luodaksesi tarvitsemasi haun/toiminnon. Voit käyttää Catch-lohkoa, jotta skriptisi lähettää sinulle sähköpostia, jos se epäonnistuu.
Kolmas osa on kätevä, jos haluat, että jokin suoritetaan riippumatta siitä, onnistuuko cmdletisi vai ei. Tähän voit käyttää Finally-lohkoa. Lisäät sen Try- ja Catch-lohkojen jälkeen ja kirjaudut, kun skriptisi osa päättyy.
Virhemuuttuja ja kirjaaminen
Skriptisi hallitsee nyt, miten se käsittelee virheitä ja miten se reagoi niihin. Voit käyttää sitä ajastettuna tehtävänä tai ainakin ajaa sen silloin, kun et ole työpöydän ääressä. Miten voit kuitenkin tutkia epäonnistunutta komentosarjaa? -ErrorVariable-parametrin avulla komentosarjasi virheet kirjoitetaan mukautettuun muuttujaan.
Tämä on vaihtoehto järjestelmän $Error-muuttujalle, joka sisältää kaikki nykyisen istunnon virheet.
Cmdletisi on saatava hieman pidemmäksi. Määrittele ensin muuttuja, jotain $SearchErrorin kaltaista riittää esimerkkiin. Kun kutsut SearchErroria ErrorVariable-parametriin, et käytä dollarimerkkiä.
Vaikka kutsut luotua muuttujaa, parametrin toimintatavasta johtuen kutsut sitä ilman dollarimerkkiä. Lisää se sitten rivin loppuun.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Continue -ErrorVariable SearchError
Jos lisäät muuttujan nimen eteen +-merkin, voit lisätä muuttujaan sen sijaan, että korvaisit sen kokonaan. Näin saat saman käyttäytymisen kuin globaalilla virhemuuttujalla. Sen sijaan voit käyttää tätä tulostetta ja Try/Catchia kirjoittaaksesi mukautetun tulosteen ja leimata sen aikaleimalla.
Jotta tämä toimisi, luo tekstitiedosto heti virhemuuttujan asettamisen jälkeen. Tee tämä New-Item-cmdletillä. Kannattaa käyttää ErrorAction-parametrin Inquire-vaihtoehtoa. Näin voit lisätä olemassa olevaan lokiin, kun New-Item-cmdlet epäonnistuu.
$SearchLog = New-Item "~\SearchLog.txt" -type file -ErrorAction Inquire
Nyt kun muodostat Try/Catch-lohkon, voit käyttää Catchia lokin kirjaamiseen tekstitiedostoon. Aikaleiman luomiseen käytetään Get-Date -ohjelmaa. Muotoilu voi olla hankalaa, joten muista kopioida se esimerkistä.
Try{
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Stop -ErrorVariable SearchError
}
Catch{
Add-Content -Path $SearchLog -Value "$(Get-Date -Format dd-MM-yy-hh_mm_ss) Files not found returned error: $SearchError"
}
Toista tämä tarpeen mukaan kaikille cmdleteillesi, ja sinulla on nyt mukava loki kaikista virheistä. Jos haluat seurata onnistuneesti suoritettuja asioita, voit lisätä samanlaisen Add-Content-lohkon Try-lohkon loppuun.
Tämä lokitus suoritetaan vain silloin, kun Try-sentti onnistuu. Voit sitten kirjata virheet ja onnistumiset aikaleimoilla varustettuna. Lokitiedostojen avulla tiedät nyt kaiken, mitä komentosarjasi on tehnyt, onnistumisen tai epäonnistumisen.
PowerShell ei ole ainoa vaihtoehtosi
Vaikka PowerShell on kätevä työkalu moniin Windows-tehtäviin, sitä voi olla vaikea oppia. Se ei myöskään sovellu kaikkeen. Jos teet tietokoneen järjestelmähuoltoa tai tarkistat tiedoston eheyden, PowerShell on kätevä. Toisaalta, jos haluat suorittaa skriptin tiedostojen lataamiseksi internetistä tai jonkin yleisemmän tehtävän suorittamiseksi, sinulla on muitakin vaihtoehtoja.
Jos olet esimerkiksi kotoisin Unix- tai Linux-taustasta, saatat olla mukavampi käyttää bash-kuorta. Windows Subsystem for Linuxin ansiosta voit nyt helposti käyttää bashia ja muita Linux-työkaluja Windows 10 -tietokoneellasi. Jos tämä kuulostaa sinusta täydelliseltä, katso oppaamme bash-selaimen käyttämiseen Windows 10:ssä.
Kris Wouk on muusikko, kirjoittaja ja mikä se onkaan, kun joku tekee videoita verkkoon. Tekniikan harrastaja niin kauan kuin hän muistaa, hänellä on ehdottomasti suosikkikäyttöjärjestelmiä ja -laitteita, mutta hän käyttää silti niin monta muuta kuin pystyy, vain pysyäkseen ajan tasalla.
Lisää Kris Woukilta