Ahogy a neve is mutatja, a PowerShell sokkal erősebb, mint a Windows szabványos parancssorozata. Ezzel a hatalommal együtt jár a zavaró hibák nagyobb lehetősége is. Ha a szkriptje hirtelen meghibásodik, nem biztos, hogy tudja, hol kezdje keresni, mi romlott el. Itt jön jól a PowerShell hibakezelése.
Ha más nyelvekkel is tisztában van, valószínűleg ismeri a hibakezelés alapjait, de van néhány, a PowerShellre jellemző aspektus, amelyet ismernie kell. A PowerShellben a hibakezelésnek négy része van: a hiba művelet paraméter, a Try/Catch blokkok, a hibaváltozó paraméter és a naplózás.
PowerShell hibakezelés egyszerűen
A PowerShell hibakezelésének első lépése az, hogy kezeljünk valamit, ami megállítja a szkriptet. Ha a hiba nem befolyásolja a szkript többi részét, akkor a legjobb lehet, ha egyszerűen megmondjuk a PowerShellnek, hogy hagyja figyelmen kívül a hibákat, és továbblépünk.
Másrészt nem mindig egyértelmű, hogy egy adott cmdlet mikor dob egy befejező hibát. Néhány cmdlet hibát ad vissza, de nem állítja le a parancsfájlját. Ez azt eredményezheti, hogy a parancsfájl befejezésére vár, miközben értelmetlenségeket ad ki.
Itt jön a képbe a -ErrorAction paraméter. Ezzel kényszerítheti a cmdletet, hogy a kívánt módon kezelje a hibát. Ha egy meglévő szkriptet módosít, akkor csatolja a cmdlet sor végére.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Stop
Nyilvánvaló, hogy ha a Get-ChildItem cmdletet önmagában használja, ez a hiba nem sokat segít. Ha azonban bármit is akarsz csinálni az adatokkal, akkor jó lenne leállítani a szkriptet, hogy tudd, hogy a keresés sikertelen volt, és hogy miért. Alternatív megoldásként, ha több keresést végez, változtassa meg a paramétert Stopról SilentlyContinue-ra, így a parancsfájl folytatódik, ha egy keresés sikertelen. Ha látni szeretné, hogy mi a hiba, akkor a Continue paramétert használhatja helyette.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction SilentlyContinue
Ha inkább azt szeretné, hogy a szkript minden egyes futtatásakor maga irányíthassa, hogy mi történjen, akkor változtassa meg a paramétert Inquire-re. Amikor a cmdletje akadozik, lehetőségeket ad meg: Yes, Yes For All, Halt Command, Suspend vagy Help.
Ez a lehetőség egy kicsit rugalmasabb, de azt jelenti, hogy a hibák miatt a szkript vár a bemenetre. Ez rendben van, ha a PowerShellt egy e-mail elküldésére vagy más egyszerű feladatra használod, de nem biztos, hogy ezt szeretnéd, ha egy hosszú folyamatot futtatsz egész éjszaka.
A PowerShell hibakezelése hatékony módon
Az ErrorAction paraméter egyszerű módon kezeli a hibákat. Ha azonban egy kicsit nagyobb kontrollra vágyik a hibák felett, a PowerShell még mindig tud Önnek segíteni. A Try/Catch használatával most már elágazhatjuk a szkriptet, amikor a cmdletek hibát adnak vissza.
Ahogy a neve is mutatja, a Try/Catch két részből áll. (Technikailag van egy harmadik is, de erre mindjárt rátérünk.) Az első a Try rész. Ebben a szakaszban fogod lefuttatni a normál kódodat. Továbbra is használni fogod a -ErrorAction paramétert, de ez csak a Stop értéket adhatja meg. Ez a jelző biztosítja, hogy a cmdleted kiváltja a Catch-et – még akkor is, ha nincs befejező hiba.
Try{
Get-Process "Cortana" -ErrorAction Stop
}
A Try a keresés sikertelensége esetén megakadályozhatja más cmdlet futását is. Ebben az esetben, ha a Get-Process eredményeit a Stop-Process-nek küldte, a sikertelen keresés megakadályozza a második cmdlet futtatását.
Tehát most, hogy létrehoztad a try cmdletblokkot, mit akarsz tenni, ha az sikertelen? A Catch felet használva ezt fogod definiálni.
Catch{
Write-Host "Process Not Found"
}
Az ErrorAction paraméterhez hasonlóan a Catch is hasznos lesz, különösen akkor, ha valami kicsit összetettebb dolgot csinálsz, mint egy egyszerű nyelvi hiba megadása. (A fenti példában a hiba kikényszerítése az alkalmazás nevének, és nem a folyamat nevének használatával történik). Tehát győződj meg róla, hogy játszol a Try blokkal, hogy létrehozd a neked szükséges keresést/akciót. A Catch blokkot használhatod a szkriptedhez, hogy sikertelenség esetén e-mailt küldjön neked.
A harmadik rész akkor jön jól, ha azt akarod, hogy valami attól függetlenül fusson, hogy a cmdleted sikerül-e vagy sem. Ehhez használhatja a Finally blokkot. Ezt a Try és a Catch után adod hozzá, és akkor naplózod, amikor a szkripted egy szakasza véget ér.
A hibaváltozó és a naplózás
A szkripted most már szabályozza, hogyan kezelje a hibákat, és hogyan reagáljon rájuk. Használhatod ütemezett feladatként, vagy legalábbis futtathatod, amikor nem az asztalodnál ülsz. Hogyan tudja azonban kivizsgálni a hibás szkriptet? A -ErrorVariable paraméterrel a cmdlet hibái egy egyéni változóba íródnak.
Ez egy alternatívája a rendszer $Error változójának, amely az aktuális munkamenet összes hibáját tartalmazza.
A cmdletednek kicsit hosszabbnak kell lennie. Először definiálj egy változót, a példában valami olyasmi, mint a $SearchError megteszi. Amikor a SearchError-t az ErrorVariable parméterben hívod, nem használod a dollárjelet.
Annak ellenére, hogy egy általad létrehozott változót hívsz meg, a paraméter működéséből adódóan a dollárjel nélkül hívod meg. Ezután add hozzá a sor végéhez.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Continue -ErrorVariable SearchError
Ha a változó neve elé egy + jelet teszel, akkor inkább hozzáadhatsz a változóhoz, minthogy egyenesen kicserélnéd. Ez ugyanazt a viselkedést eredményezi, mint a globális hibaváltozó. Ehelyett használhatja ezt a kimenetet és a Try/Catch-et egyéni kimenet írására, és időbélyegzővel láthatja el azt.
Ahhoz, hogy ez működjön, hozzon létre egy szöveges fájlt közvetlenül a hibaváltozó beállítása után. Tegye ezt a New-Item cmdlet segítségével. Érdemes az Inquire opciót használni a ErrorAction paraméterhez. Ez lehetővé teszi, hogy a New-Item cmdlet sikertelensége esetén hozzáadjon egy meglévő naplóhoz.
$SearchLog = New-Item "~\SearchLog.txt" -type file -ErrorAction Inquire
Most, amikor létrehozza a Try/Catch blokkot, a Catch segítségével naplózhat egy szöveges fájlba. Az időbélyegző létrehozásához a Get-Date funkciót használja. A formázás trükkös lehet, ezért ezt mindenképpen másold át a példából.
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"
}
Ismételje meg ezt szükség szerint az összes cmdlethez, és máris van egy szép naplója az esetleges hibákról. Ha nyomon akarja követni a sikeresen lefutott dolgokat, akkor a Try blokk végére egy hasonló Add-Content-et adhat.
Ez a naplózás csak akkor fut le, ha a Try cmdlet sikeres. Ezután naplózhatod a hibákat és a sikereket időbélyegekkel. A naplózásból most már mindent megtudhatsz, amit a szkripted végzett, legyen az sikeres vagy sikertelen.
A PowerShell nem az egyetlen lehetőség
Bár a PowerShell rengeteg Windows-feladathoz hasznos eszköz, megtanulni nehéz lehet. Emellett nem is alkalmas mindenre. Ha rendszerkarbantartást végez a számítógépén, vagy egy fájl sértetlenségét ellenőrzi, a PowerShell praktikus. Másrészt, ha egy szkriptet szeretne futtatni fájlok letöltéséhez az internetről vagy valamilyen általánosabb feladathoz, akkor más lehetőségek állnak rendelkezésére.
Ha például Unix vagy Linux háttérrel rendelkezik, akkor a bash shell használata kényelmesebb lehet. A Windows Subsystem for Linuxnak köszönhetően mostantól könnyedén használhatja a bash és más Linux-eszközöket Windows 10-es számítógépén. Ha ez tökéletesen hangzik az Ön számára, akkor ne keressen tovább, mint a bash shell Windows 10-en való futtatására vonatkozó útmutatónk.
Kris Wouk zenész, író, és bárhogy is hívják azt, amikor valaki videókat készít a webre. Amióta az eszét tudja, a technológia szerelmese, határozottan vannak kedvenc operációs rendszerei és eszközei, de amúgy is annyi mást használ, amennyit csak tud, csak hogy képben maradjon.
Még több Kris Wouktól