Adam the Automator

heb je ooit een script of een PowerShell cmdlet gedraaid en word je geconfronteerd met een schreeuwende muur van tekst – in het rood – zoals hieronder weergegeven?

voorbeeld van fouten in PowerShell

fouten kunnen overweldigend en verwarrend worden. En vooral, fouten zijn vaak moeilijk te lezen, wat maakt het bepalen wat en waar het script verkeerd ging bijna onmogelijk.,

gelukkig heb je een aantal opties in PowerShell om dit beter te maken door foutafhandeling. Met behulp van foutafhandeling, kunnen fouten worden gefilterd en weergegeven op een zodanige manier dat het gemakkelijker te maken zin van. En, het begrijpen van de fout maakt het gemakkelijk om meer logica toe te voegen aan foutafhandeling.

in dit artikel leert u over fouten in PowerShell en hoe ze kunnen worden onderschept om fouten te verwerken met behulp van de PowerShell Try Catch blokken (en finally blokken).,

inhoudsopgave

inzicht in hoe fouten werken in PowerShell

voordat we ingaan op foutafhandeling, laten we eerst een paar Concepten behandelen rond fouten in PowerShell. Het begrijpen van fouten kan leiden tot betere foutafhandelingsstrategieën.

de automatische variabele $Error

in PowerShell zijn er veel automatische variabelen, en een daarvan is de automatische variabele $Error. PowerShell gebruikt de variabele $Error om alle fouten in de sessie op te slaan., De$Error variabele is een reeks fouten gesorteerd op de meest recente.

wanneer u voor het eerst een PowerShell-sessie opent, is de variabele $Error leeg. U kunt dit controleren door de variabele $Error aan te roepen.

de variabele $Error is leeg

zoals u kunt zien, begint de variabele $Error leeg., Maar zodra een fout is gegenereerd, zal de fout worden toegevoegd en opgeslagen in de $Error variabele.

in het voorbeeld hieronder wordt de fout gegenereerd door opzettelijk een service naam te verkrijgen die niet bestaat.

PS> Get-Service xyzPS> $ErrorPS> $Error.Count
de fout wordt toegevoegd aan de variabele $Error

zoals u kunt zien in de uitvoer hierboven werd de gegenereerde fout toegevoegd aan de $Errorvariabele.,

De $Error variabele bevat een verzameling fouten gegenereerd in de PowerShell sessie. Elke fout kan toegang krijgen door de array positie aan te roepen. De laatste fout staat altijd op index 0.

bijvoorbeeld, de laatste fout kan worden opgehaald met $Error.

de $Error Objecteigenschappen

omdat alles in PowerShell een object is, is de variabele $Error Een object, en objecten hebben eigenschappen., Door de $Error variabele te doorsluizen naar de Get-Member cmdlet, ziet u de lijst met beschikbare eigenschappen.

$Error | Get-Member
the $Error object properties

om de reden voor de fout te bepalen, kunt u bekijk de inhoud van de eigenschap InvocationInfo met het onderstaande commando.,

$Error.InvocationInfo
the InvocationInfo property

nu kunt u hetzelfde doen met de andere eigenschappen en ontdek welke andere informatie U kunt vinden!

Beëindigingsfouten

Beëindigingsfouten stoppen de uitvoerstroom wanneer deze wordt aangetroffen door PowerShell vs niet-beëindigingsfouten. Er zijn verschillende manieren waarop een beëindigingsfout kan optreden. Een voorbeeld is wanneer je een cmdlet aanroept met een parameter die niet bestaat.,

zoals u zult zien in de screenshot hieronder, wanneer het commando Get-Process notepad wordt uitgevoerd, is het commando geldig en worden de details van het Kladblok-proces weergegeven.

kladblok proces-details

Maar, wanneer een parameter die niet is gebruikt, zoals Get-Process notepad -handle 251, de cmdlet geeft een foutmelding dat de handle parameter is niet geldig. Vervolgens wordt de cmdlet afgesloten zonder de details van het notepad proces te tonen.,

fout wordt gegooid omdat de parameter ongeldig is

niet-beëindigende fouten

niet-beëindigende fouten zijn fouten die de uitvoering niet stoppen van het script of commando. Bijvoorbeeld, check out de code hieronder. Deze code krijgt de lijst met bestandsnamen uit de bestandlijst.txt-bestand. Vervolgens, het script gaat door elke bestandsnaam, lees de inhoud van elk bestand, en voert het uit op het scherm.

$file_list = Get-Content .\filelist.txtforeach ($file in $file_list) { Write-Output "Reading file $file" Get-Content $file}

de inhoud van de filelist.,txt bestand zijn de bestandsnamen toont in de lijst hieronder.

File_1.logFile_2.logFile_3.logFile_4.logFile_5.logFile_6.logFile_7.logFile_8.logFile_9.logFile_10.log

maar wat als File_6.het logboek bestond niet echt? Wanneer je de code uitvoert, zou je verwachten dat er een fout zal optreden omdat het script de File_6 niet kan vinden.log. U zult een soortgelijke uitvoer hieronder zien.

voorbeeld van niet-beëindigende fout

zoals u kunt zien op de screenshot van het bovenstaande resultaat, kon het script de eerste vijf bestanden in de lijst lezen, maar toen het probeerde om het bestand te lezen file_6.,txt, een fout wordt geretourneerd. Het script bleef vervolgens de rest van de bestanden lezen voordat het werd afgesloten. Het is niet beëindigd.

de $ ErrorActionPreference variabele

tot nu toe heb je geleerd over de terminating en niet-terminating fouten en hoe ze van elkaar verschillen. Maar wist u dat een niet-beëindigende fout kan worden gedwongen om te worden behandeld als een beëindigende fout?

PowerShell heeft een concept genaamd voorkeursvariabelen. Deze variabelen worden gebruikt om te veranderen hoe PowerShell zich op veel verschillende manieren gedraagt. Een van deze variabelen wordt $ErrorActionPreferencegenoemd.,

de variabele $ErrorActionPreference wordt gebruikt om de manier te veranderen waarop PowerShell niet-beëindigende fouten behandelt. Standaard is de waarde $ErrorActionPreference ingesteld op Continue. Het wijzigen van de waarde van de $ErrorActionPreference variabele naar STOPdwingt PowerShell om alle fouten te behandelen als beëindigingsfouten.

gebruik de onderstaande code om de waarde $ErrorActionPreference te wijzigen.,

$ErrorActionPreference = "STOP"

voor meer informatie over andere geldige variabele waarden van $ErrorActionPreference, bezoek PowerShell ErrorActionPreference.

refereer nu terug naar het voorbeeld dat gebruikt wordt in de sectie niet-Terminating Errors in dit artikel. Het script kan worden aangepast om de verandering in $ErrorActionPreference op te nemen zoals de onderstaande code:

het uitvoeren van de gewijzigde code hierboven zal zich anders gedragen dan voorheen wanneer de waarde $ErrorActionPreference is ingesteld op de standaardwaarde van Continue.,

Forceren van een beëindiging fout met behulp van de $ErrorActionPreference variabele

Zoals je kunt zien op de screenshot van het resultaat hierboven, het script was in staat om te lezen van de eerste vijf bestanden in de lijst, maar toen het probeerde om het bestand te lezen File_6.txt, een fout wordt geretourneerd omdat het bestand niet werd gevonden. Dan, het script beëindigd, en de rest van de bestanden worden niet gelezen.,

de waarde $ErrorActionPreference is alleen geldig in de huidige PowerShell-sessie. Het reset naar de standaardwaarde zodra een nieuwe PowerShell-sessie is gestart.

de ErrorAction Common Parameter

als de $ErrorActionPreference waarde wordt toegepast op de PowerShell-sessie, is de ErrorAction parameter van toepassing op elke cmdlet die gemeenschappelijke parameters ondersteunt. De parameter ErrorAction accepteert dezelfde waarden als de variabele $ErrorActionPreference.,

deErrorAction parameter waarde heeft voorrang op de$ErrorActionPreference waarde.

laten we teruggaan en dezelfde code gebruiken in het vorige voorbeeld. Maar deze keer wordt de parameter ErrorAction toegevoegd aan de lijn Get-Content.

na het uitvoeren van de gewijzigde code, zult u zien dat, hoewel de $ErrorActionPreference is ingesteld op Continue, het script nog steeds beëindigd is zodra er een fout is opgetreden., Het script werd beëindigd omdat de-ErrorAction parameterwaarde inGet-Content is ingesteld opSTOP.

Forceren van een beëindiging fout met behulp van de ErrorAction parameter

het Gebruik van PowerShell Try Catch Blokken

Op dit punt, je hebt geleerd over PowerShell fouten en hoe je de $ErrorActionPreference variabele en ErrorAction parameters werken., Nu is het tijd dat je leert over de goede dingen – de PowerShell Try Catch Finally blokken.

PowerShell try catch blokken (en optioneel finally block) zijn een manier om een net rond een stuk code te werpen en eventuele fouten op te vangen die terugkeren.

onderstaande code toont de syntaxis van het Try statement.

try { <statement list>}catch *]{ <statement list>}finally { <statement list>}

het Try blok bevat de code die PowerShell moet” proberen ” en controleren op fouten., Als de code in deTry blok een fout tegenkomt, wordt de fout toegevoegd aan de$Error variabele en vervolgens doorgegeven aan deCatch blok.

hetCatch blok bevat de uit te voeren acties wanneer het een fout ontvangt van hetTry blok. Er kunnen meerdereCatch blokken zijn in eenTry statement.

hetFinally blok bevat de code die aan het einde van hetTry statement staat., Dit blok draait of er al dan niet een fout is ontkoppeld.

vangen van niet-specifieke fouten (Catch-All)

a simple Try statement contains a Try and a Catch block. Het blok Finally is optioneel.

bijvoorbeeld, om een niet-specifieke uitzondering te vangen, moet de parameter Catch leeg zijn. De voorbeeldcode hieronder gebruikt hetzelfde script dat werd gebruikt in de $ErrorActionPreference variabele sectie maar gewijzigd om de Try Catch blokken te gebruiken.,

zoals u kunt zien aan de onderstaande code, is deze keer het foreach statement ingesloten in het Try blok. Vervolgens bevat eenCatch blok de code om de tekenreeksAn Error Occurred weer te geven als er een fout is opgetreden. De code in hetFinally blok wist zojuist de$Error variabele.

de bovenstaande code, na het draaien in PowerShell, geeft u de onderstaande uitvoer.,

Script beëindigd wanneer er een fout optrad

De uitvoer hierboven laat zien dat het script een fout heeft ondervonden, de code in de Catch block, and then terminated.

de fout werd behandeld, wat het punt van foutafhandeling was. De weergegeven fout was echter te Algemeen. Om een meer beschrijvende fout te tonen, kunt u toegang krijgen tot de eigenschap Exception van de fout die werd doorgegeven door het Try blok.,

de onderstaande code wordt gewijzigd, specifiek de code in hetCatch blok, om de uitzondering bericht van de huidige fout die werd doorgegeven in de pijplijn – $PSItem.Exception.Message

Deze keer, wanneer de gewijzigde code hierboven wordt uitgevoerd, het weergegeven bericht is een stuk beschrijvend.,

Script beëindigd met een beschrijvende foutmelding

specifieke fouten opvangen

Er zijn momenten waarop een catch-all-foutafhandeling niet de meest geschikte aanpak is. Misschien wilt u dat uw script een actie uitvoert die afhankelijk is van het type fout dat wordt aangetroffen.

Hoe bepaalt u het fouttype? Door de TypeName waarde van de Exception eigenschap van de laatste fout te controleren., Om bijvoorbeeld het fouttype uit het vorige voorbeeld te vinden, gebruik je het volgende commando:

$Error.Exception | Get-Member

het resultaat van de bovenstaande code zou eruit zien als het screenshot hieronder. Zoals u kunt zien, wordt de waarde TypeName weergegeven – System.Management.Automation.ItemNotFoundException.

krijg de Fouttypenaamwaarde

nu u het fouttype kent dat u moet onderscheppen, wijzigt u de code om het specifiek op te vangen., Zoals je ziet in de gewijzigde code hieronder, zijn er nu tweeCatch blokken. Het eersteCatch blok onderschept een specifiek type fout (System.Management.Automation.ItemNotFoundException). Daarentegen bevat het tweedeCatch blok de Algemene, catch-all foutmelding.

onderstaande schermafbeelding toont de uitvoer van de gewijzigde code hierboven.,

Script beëindigd met een specifieke foutmelding

conclusie

in dit artikel hebt u geleerd over fouten in PowerShell, zijn eigenschappen, en hoe je het specifieke type fout kunt bepalen. U hebt ook het verschil geleerd tussen hoe de$ErrorActionPreference variabele en deErrorAction parameter van invloed is op hoe PowerShell niet-beëindigende fouten behandelt.,

u hebt ook geleerd hoe u de PowerShell Try Catch Finally blokken kunt gebruiken om fouten te verwerken, of het nu gaat om specifieke fouten of een catch-all aanpak.

De voorbeelden die in dit artikel worden getoond, tonen alleen de basis van hoe de Try Catch Finally blokken werken. De kennis die ik hoop dat je hebt opgedaan in dit artikel moet geven u de startblokken om te beginnen met het toepassen van foutafhandeling in uw scripts.,

verder lezen

  • About_Try_Catch_Finally
  • About_Automatic_Variables
  • Back to Basics: the PowerShell foreach Loop
  • Back to Basics: Understanding PowerShell Objects

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *