Jak už název napovídá, prostředí PowerShell je mnohem výkonnější než standardní příkazový řádek systému Windows. S touto silou přichází i větší možnost matoucích chyb. Pokud váš skript náhle selže, možná nebudete vědět, kde začít hledat, co se pokazilo. Zde se hodí obsluha chyb prostředí PowerShell.
Pokud jste obeznámeni s jinými jazyky, pravděpodobně znáte základy zpracování chyb, ale existují některé aspekty specifické pro prostředí PowerShell, které budete muset znát. Obsluha chyb v prostředí PowerShell má čtyři části: parametr Error Action, bloky Try/Catch, parametr Error Variable a protokolování.
Jednoduché zpracování chyb prostředí PowerShell
Prvním krokem při zpracování chyb prostředí PowerShell je vypořádání se s něčím, co zastaví váš skript v jeho běhu. Pokud chyba neovlivní zbytek skriptu, může být nejlepší prostě říci prostředí PowerShell, aby chyby ignorovalo, a pokračovat dál.
Na druhou stranu není vždy jasné, kdy daný rutina vyhodí ukončovací chybu. Některé rutiny vracejí chybu, ale skript neukončí. To může způsobit, že budete čekat na dokončení skriptu, zatímco ten bude vypisovat nesmysly.
Zde přichází na řadu parametr -ErrorAction. Pomocí něj vynutíte, aby rutina zpracovala chybu požadovaným způsobem. Pokud upravujete existující skript, připojíte jej na konec řádku rutiny.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Stop
Pokud používáte rutinu Get-ChildItem samostatně, tato chyba vám samozřejmě moc nepomůže. Pokud však chcete s daty něco dělat, bylo by dobré skript zastavit, abyste věděli, že vyhledávání selhalo a proč. Případně, pokud provádíte více vyhledávání, změňte parametr Stop na SilentlyContinue, aby skript pokračoval, pokud se vyhledávání nezdaří. Pokud chcete vidět, jaká je chyba, můžete místo toho použít jako parametr Continue.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction SilentlyContinue
Pokud byste raději měli možnost kontrolovat, co se stane při každém spuštění skriptu, můžete změnit parametr na Dotaz. Když váš rutina narazí na zádrhel, nabídne možnosti: Ano, Ano pro všechny, Zastavit příkaz, Pozastavit nebo Nápověda.
Tato možnost je o něco flexibilnější, ale znamená, že chyby způsobí, že váš skript bude čekat na váš vstup. To je v pořádku, pokud používáte prostředí PowerShell k odeslání e-mailu nebo jiné jednoduché úlohy, ale nemusí to být něco, co byste chtěli, když spouštíte dlouhý proces přes noc.
Obsluha chyb prostředí PowerShell výkonným způsobem
Parametr ErrorAction řeší chyby nekomplikovaným způsobem. Pokud však hledáte trochu větší kontrolu nad chybami, PowerShell vám ji stále nabízí. Pomocí funkce Try/Catch můžeme nyní rozvětvit skript, když rutiny vrátí chybu.
Jak název napovídá, Try/Catch se skládá ze dvou částí. (Technicky existuje ještě třetí, ale k té se dostaneme za chvíli.) První je část Try. V této části budete spouštět svůj běžný kód. Stále budete používat parametr -ErrorAction, ale ten může být nastaven pouze jako Stop. Tento příznak zajistí, že váš rutina spustí příkaz Catch — i v případě, že nemá ukončující chybu.
Try{
Get-Process "Cortana" -ErrorAction Stop
}
Try může také zabránit spuštění dalších rutin, pokud hledání selže. V tomto případě, pokud jste odesílali výsledky Get-Process do Stop-Process, zabrání neúspěšné vyhledávání spuštění druhé rutiny.
Když jste tedy nyní vytvořili blok rutin try, co chcete udělat, když selže? Pomocí poloviny příkazu Catch to definujete.
Catch{
Write-Host "Process Not Found"
}
Stejně jako u parametru ErrorAction, když děláte něco trochu složitějšího, bude se vám Catch hodit k něčemu víc než jen k prostému zadání selhání, zejména když děláte něco trochu složitějšího. (Ve výše uvedeném příkladu je selhání vynuceno použitím názvu aplikace, a ne názvu procesu.) Proto si nezapomeňte pohrát s blokem Try, abyste vytvořili hledání/akci, kterou potřebujete. Blok Catch můžete použít k tomu, aby vám skript v případě neúspěchu poslal e-mail.
Třetí část se hodí, pokud chcete, aby se něco spustilo bez ohledu na to, zda váš cmdlet uspěje, nebo ne. K tomu můžete použít blok Finally. Ten přidáte za Try a Catch a zaznamenáte, když část skriptu skončí.
Proměnná Chyba a protokolování
Váš skript nyní řídí, jakým způsobem zpracovává chyby a jak na ně reaguje. Můžete jej použít jako naplánovanou úlohu nebo jej alespoň spustit, když nejste u svého stolu. Jak však můžete vyšetřit neúspěšný skript? Pomocí parametru -ErrorVariable se chyby vašeho rutiny zapisují do vlastní proměnné.
Jedná se o alternativu k systémové proměnné $Error, která obsahuje všechny chyby z aktuální relace.
Váš cmdlet musí být o něco delší. Nejprve definujte proměnnou, pro tento příklad postačí něco jako $SearchError. Při volání SearchError v parmetru ErrorVariable nepoužijete znak dolaru.
Přestože voláte vytvořenou proměnnou, vzhledem ke způsobu fungování parametru ji voláte bez znaku dolaru. Tu pak přidejte na konec řádku.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Continue -ErrorVariable SearchError
Pokud před název proměnné přidáte znaménko +, můžete proměnnou přidat, nikoli ji rovnou nahradit. Tím dosáhnete stejného chování jako u globální chybové proměnné. Místo toho můžete použít tento výstup a Try/Catch k zápisu vlastního výstupu a opatřit jej časovým razítkem.
Aby to fungovalo, vytvořte textový soubor hned po nastavení chybové proměnné. Udělejte to pomocí rutiny New-Item. Možná budete chtít použít možnost Dotaz pro parametr ErrorAction. To vám umožní přidat do existujícího protokolu, když rutina New-Item selže.
$SearchLog = New-Item "~\SearchLog.txt" -type file -ErrorAction Inquire
Nyní můžete při sestavování bloku Try/Catch použít příkaz Catch pro protokolování do textového souboru. K vytvoření časového razítka použijete funkci Get-Date. Formátování může být složité, takže si ho nezapomeňte opsat z příkladu.
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"
}
Opakujte to podle potřeby pro všechny své rutiny a nyní máte k dispozici pěkný protokol všech chyb. Pokud chcete sledovat věci, které proběhly úspěšně, můžete na konec bloku Try přidat podobný Add-Content.
Toto protokolování se spustí pouze tehdy, když váš rutinní příkaz Try uspěje. Můžete pak zaznamenávat chyby a úspěchy s časovými razítky. Díky protokolování nyní víte o všem, co váš skript provedl, ať už úspěšně nebo neúspěšně.
PowerShell není vaše jediná možnost
PowerShell je sice užitečný nástroj pro spoustu úloh systému Windows, ale naučit se ho může být náročné. Nehodí se také na všechno. Pokud provádíte údržbu systému v počítači nebo kontrolujete integritu souboru, je PowerShell užitečný. Na druhou stranu, pokud chcete spustit skript pro stahování souborů z internetu nebo nějakou obecnější úlohu, máte jiné možnosti.
Pokud například pocházíte z prostředí Unixu nebo Linuxu, bude vám možná více vyhovovat použití prostředí bash. Díky subsystému Windows Subsystem for Linux můžete nyní v počítači se systémem Windows 10 snadno používat bash a další nástroje Linuxu. Pokud vám to zní dokonale, nehledejte nic jiného než našeho průvodce zprovozněním shellu bash v systému Windows 10.
Kris Wouk je hudebník, spisovatel a vůbec to, jak se říká tomu, když někdo natáčí videa pro web. Je technologickým nadšencem, co si jen pamatuje, a rozhodně má oblíbené operační systémy a zařízení, ale stejně používá co nejvíc dalších, jen aby byl v obraze.
Více od Krise Wouka