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?
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.
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
zoals u kunt zien in de uitvoer hierboven werd de gegenereerde fout toegevoegd aan de $Error
variabele.,
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
om de reden voor de fout te bepalen, kunt u bekijk de inhoud van de eigenschap InvocationInfo
met het onderstaande commando.,
$Error.InvocationInfo
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.
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.,
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.
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 $ErrorActionPreference
genoemd.,
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 STOP
dwingt 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
.,
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
.
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.,
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.,
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
.
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.,
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