Een fout in een PowerShell script zal voorkomen dat het succesvol wordt afgerond. Het gebruik van foutafhandeling met try catch blocks zorgen voor het beheren en reageren op deze beëindigingsfouten. In dit bericht zal ik de basisprincipes van try/catch blokken en hoe te vinden en omgaan met specifieke uitzondering berichten.

het begrijpen van de syntaxis

de syntaxis van try catch block is zeer eenvoudig., Het is samengesteld uit twee secties ingesloten in krullende beugels met de eerste geïdentificeerd als de try block en de tweede als de catch block.

try { # Statement to try}catch { # What to do with terminating errors}

Het try block kan zoveel statements bevatten als Ik wil; ik zou echter aanraden om het zo weinig mogelijk te houden, waarschijnlijk slechts één statement. Het punt van foutafhandeling is om met één statement tegelijk te werken en om te gaan met alles wat ermee gebeurt.

Hier is een voorbeeld van een fout die optreedt in de PowerShell console., Hier maak ik een nieuw bestand aan met behulp van de cmdlet New-Item en specificeer ik een niet-bestaande map voor Pad:

als dit in een script was, zou het uitvoeren van dit naar het scherm wat ruimte verspillen en het probleem is mogelijk niet direct zichtbaar. Met behulp van een try catch block, kan ik beginnen met het manipuleren van de fout uitvoer en maken het meer admin vriendelijk.

Hier is ons zelfde nieuwe-Item commando in een try catch blok. Merk op dat ik op Regel 2 De parameter ErrorAction met de waarde Stop moest toevoegen aan het commando., Niet alle fouten worden beschouwd als “beëindigen”, dus soms moet ik dit stukje code toevoegen om correct te eindigen in het catch block.

in plaats van een blok rode boos uitziende tekst, heb ik een eenvoudige waarschuwing dat er een probleem is opgetreden. De niet-bestaande pad naam samen met forcing-ErrorAction Stop daalt de logica in de vangst blok en weer te geven mijn aangepaste waarschuwing.

met behulp van de $ Error variabele

hoewel leesbaarder, is dit niet erg nuttig., Ik weet alleen dat het commando niet succesvol is afgerond, maar ik weet niet waarom. In plaats van mijn aangepaste bericht weer te geven, kan ik de specifieke foutmelding die zich heeft voorgedaan in plaats van de hele rode tekst uitzondering blok. Wanneer er een fout optreedt in het try-blok, wordt deze opgeslagen in de variabele $Error. De $ Error variabele bevat een array van recente fouten, en ik kan verwijzen naar de meest recente fout in de array bij index 0.,

De waarschuwingsuitvoer is nu beschrijvend en laat zien dat het commando is mislukt omdat het geen deel van het pad kon vinden. Dit bericht was een onderdeel van onze oorspronkelijke foutmelding, maar is nu beknopter.

met uitzondering van berichten

Ik kan ook meerdere vangblokken gebruiken als ik specifieke fouten anders wil behandelen. Hier ga ik twee verschillende aangepaste berichten weer te geven, een voor als het pad niet bestaat en een voor als een illegaal karakter wordt gebruikt in de naam., Merk op dat ik in de volgende schermafbeelding het script twee keer heb uitgevoerd met twee verschillende commando ‘ s in het try block. Elk commando, catch block en de uiteindelijke uitvoer worden aangegeven door de oranje en groene pijlen.

kijkend naar regels 14-16, is er een derde catch block zonder uitzondering bericht. Dit is een” catch-all ” catch block die wordt uitgevoerd als de fout niet overeenkomt met een andere catch block uitzondering., Als ik het uitvoeren van dit script en zie het bericht in de laatste vangst blok, dan Weet ik dat de fout is niet gerelateerd aan een illegaal teken in de bestandsnaam of een deel van het pad niet geldig.

hoe wist ik nu welke uitzonderingsberichten ik moest gebruiken in de eerste twee vangblokken? Dit kan worden gevonden door te kijken naar de verschillende informatie die is gekoppeld aan de $Error variabele. Nadat een mislukte opdracht optreedt, kan ik $Error uitvoeren.Uitzondering.GetType ().Volledige naam om het uitzonderingsbericht te bekijken voor de laatste fout die is opgetreden.,

teruggaand naar de PowerShell console, herkanste ik het New-Item commando met een niet-bestaand pad, waarna ik mijn $Error Commando uitvoerde om het exception bericht te vinden.

De rode tekst direct na het mislukte commando bevat ook het uitzonderingsbericht, maar bevat niet van welke module het afkomstig is. Kijkend naar de $Error variabele toont het volledige bericht dat gebruikt moet worden voor een catch block.,

het gebruik van try / catch blocks geeft extra kracht bij het verwerken van fouten in een script en het nemen van verschillende acties op basis van de fout. De catch block kan Meer weergeven dan alleen een foutmelding. Het kan logica bevatten die de fout zal oplossen en doorgaan met het uitvoeren van de rest van het script.