Hoe PowerShell te gebruiken Probeer Catch Eindelijk om met fouten om te gaan

15 juli 2021 10258 Keer bekeken Andere belangrijke informatie over PowerShell Probeer

Een PowerShell Proberen te vangen block wordt gebruikt om fouten in PowerShell-scripts af te handelen. Bij gebruik van PowerShell Proberen te vangen blok voor scripting kunt u het volgende bereiken:





  1. Zorg ervoor dat uw script ondanks een fout blijft werken
  2. Foutmeldingen beter weergeven en afhandelen

In deze handleiding leert u hoe u Powershell gebruikt Proberen te vangen blokken om beëindigingsfoutberichten in PowerShell af te handelen. Daarnaast leer je hoe je de Eindelijk blok in a Proberen te vangen blok.



De gids begint met de syntaxis van de Proberen te vangen blok.

Blader door berichtonderwerpen



PowerShell Proberen te vangen Syntaxis

PowerShell Probeer Catch-syntaxis

De syntaxis van PowerShell Proberen te vangen is…



|__+_|

De Poging is het deel van het blok dat u door PowerShell wilt laten controleren op fouten. Dit is het blok met de originele scripts die een afsluitfout kunnen retourneren.

Wanneer er een fout optreedt in het Try-blok, slaat PowerShell de fout op in de automatische variabele $Error (hierover later meer).



Aan de andere kant, t hij vangst verklaring van de PowerShell Proberen te vangen block verwerkt de fouten die in het try-blok zijn gegenereerd. U kunt ook de soorten fouten specificeren die worden afgehandeld binnen de Vangst statement blok.



De Eindelijk block kan worden gebruikt om bronnen vrij te maken die niet langer nodig zijn voor het script.

Veelvoorkomende soorten uitzonderingsfouten in PowerShell Proberen te vangen

Soorten fouten in PowerShell Probeer Catch

U kunt verschillende soorten fouten in een PowerShell Try Catch-blok afhandelen. U kunt bijvoorbeeld specifieke fouten afhandelen.

Daarnaast kun je generieke foutmeldingen afhandelen. Om specifieke soorten fouten af ​​te handelen, moet u echter het type fout weten.

verderop in deze handleiding leert u dat foutmeldingen worden opgeslagen in de automatische variabele $error. Bovendien kunnen fouten ook worden opgeslagen in de $_ pipeline-variabele.

Bovendien worden fouten die zijn opgeslagen in de automatische variabele $error, opgeslagen in een array. Om dit te helpen verklaren, laten we een opdracht uitvoeren die een beëindigingsfoutbericht retourneert:

Om alle fouten te wissen die eerder zijn opgeslagen in de $fout automatische variabele, voordat u de onderstaande opdracht uitvoert, voert u eerst uit $fout.Clear() opdracht. |__+_| Er is geen gebeurtenislogboek met de naam Systerr, dus de opdracht in het Try-blok zal een foutmelding geven.

Verrassend genoeg gaf de opdracht geen foutmelding weer. Dus, wat is er met de foutmelding gebeurd?

Het wordt opgeslagen in de automatische variabele $error! Om de fout van de laatste opdracht weer te geven, opgeslagen in de $error-variabele, voert u de opdracht uit...

|__+_|

Het resultaat van de opdracht geeft de foutdetails weer die zijn opgeslagen in de automatische variabele $error. De foutinformatie heeft een sectie genaamd FullyQualifiedErrorId .

Voor deze specifieke fout, de FullyQualifiedErrorId heeft twee sets informatie - System.InvalidOperationException en Microsoft.PowerShell.Commands.GetEventLogCommand .

De informatie waarin we geïnteresseerd zijn is: System.InvalidOperationException . Dit is een type fout dat u kunt vangst in het PowerShell Try Catch-blok.

Voer de onderstaande opdracht uit om de naam van deze PowerShell-uitzondering te krijgen:

|__+_|

Daar is het, System.InvalidOperationException !

In de volgende subsecties zal ik veelvoorkomende PowerShell Try Catch Exception-fouten bespreken.

PowerShell proberen te vangen CommandNotFoundException Fout

Als u een opdracht uitvoert die niet bestaat in PowerShell of Microsoft Command Prompt, ontvangt u een foutmelding. Als u bijvoorbeeld de Get-File opdracht ontvangt, ontvangt u een foutbericht omdat deze opdracht geen geldige PowerShell-cmdlet is.

Hier is een screenshot van het resultaat van de opdracht in PowerShell...

PowerShell Probeer de CommandNotFoundException-fout te vangen

Zoals je kunt zien in de schermafbeelding, is het type uitzondering (FullyQualifiedErrorId ) CommandNotFoundException .

Aangezien dit een beëindigingsfout is, zal het ervoor zorgen dat uw script niet verder gaat. Om te voorkomen dat deze fout uw script beëindigt, wikkelt u de opdracht in a Proberen te vangen blok.

Als we deze fout in een PowerShell Try Catch-blok plaatsen, onderdrukt PowerShell de fout. Bovendien zal het stoppen met het beëindigen van uw script.

Hoewel de fout wordt onderdrukt, wordt deze echter opgeslagen in de variabele $error. Zoals gewoonlijk, voordat u de onderstaande opdracht uitvoert, moet u eerst de fouten wissen die zijn opgeslagen in de $error-variabele.

|__+_|

Als u de opdracht in PowerShell in plaats van PowerShell ISE wilt uitvoeren, typt u de opdrachten in een enkele regel, zoals hieronder wordt weergegeven:

|__+_|

Voer vervolgens uit om de fout weer te geven...

|__+_|

Zoals ik al zei in de hoofdinleiding van deze sectie, voer je de onderstaande opdracht uit om de uitzonderings-ID voor deze fout weer te geven:

|__+_|

De volledige naam van de uitzondering is System.Management.Automation.CommandNotFoundException .

PowerShell proberen te vangen BeheerObjectNiet gevondenUitzondering Fout

Wanneer u een opdracht uitvoert in een externe PS-sessie met de verkeerde informatie, retourneert PowerShell a BeheerObjectNiet gevondenUitzondering fout.

Een typisch scenario is wanneer u verbinding maakt met Office 365 met PowerShell. Voer vervolgens de opdracht Get-User uit, maar geef de verkeerde gebruiker op identiteit .

PowerShell Probeer Catch ManagementObjectNotFoundException Error

Gebruik een opdracht die lijkt op de onderstaande om deze fout op te vangen met PowerShell Try Catch:

|__+_| De vangen BeheerObjectNiet gevondenUitzondering fout met PowerShell Probeer, Catch is bijzonder lastig. Je moet de gebruiken FoutActie parameter en specificeer Stoppen . Anders, zelfs met Try, Catch, wordt de fout nog steeds weergegeven.

Gebruik ten slotte de onderstaande opdracht om de naam van de uitzondering te krijgen:

|__+_|

De opdracht retourneert het type uitzondering als System.Management.Automation.RemoteException . Dus wat is BeheerObjectNiet gevondenUitzondering ?

BeheerObjectNiet gevondenUitzondering is de reden voor de uitzondering zoals bevestigd door de onderstaande opdracht:

hoe u alle gebruikersrechten kunt resetten naar standaardvensters 10
|__+_|

PowerShell proberen te vangen Uitzondering voor onbevoegde toegang Fout

Een andere veelvoorkomende PowerShell-uitzonderingsfout is: Uitzondering voor onbevoegde toegang . Dit type fout treedt op wanneer u probeert toegang te krijgen tot een item waarvoor u niet ten minste een leesmachtiging heeft.

Om dit voorbeeld te illustreren, heb ik geverifieerde gebruikers de toegang tot een specifiek bestand op mijn computer geweigerd.

PowerShell Probeer UnauthorizedAccessException-fout te vangen

Als ik nu probeer toegang te krijgen tot het bestand met de opdracht Get-Content, ontvang ik een bericht dat toegang is geweigerd.

|__+_|

Om te voorkomen dat deze fout wordt weergegeven, voert u de opdracht uit in het PowerShell Try Catch-blok zoals hieronder wordt weergegeven...

|__+_|

Helaas stopt de bovenstaande opdracht niet met het weergeven van de fout. De reden is dat het geen afsluitfout is.

Om de foutweergave te stoppen, voegt u de FoutActie parameter en specificeer Stoppen .

|__+_|

Nu onderdrukt de opdracht de fout. Voer de onderstaande opdracht uit om het type uitzondering weer te geven...

|__+_|

Het type uitzondering is: System.UnauthorizedAccessException .

Er zijn meer soorten uitzonderingsfouten dan in deze sectie wordt behandeld. Ik heb alleen de meest voorkomende soorten uitzonderingen behandeld.

Specifieke uitzonderingen vastleggen met PowerShell Probeer Catch

Specifieke uitzonderingen vastleggen met PowerShell Probeer Catch

In de laatste sectie zijn veelvoorkomende Power shell-uitzonderingen besproken en hoe u het type uitzondering kunt vinden. In dit gedeelte wordt beschreven hoe u die informatie kunt gebruiken om specifieke typen foutberichten vast te leggen.

In de syntaxissectie van deze handleiding zei ik dat de algemene syntaxis van een PowerShell Try Catch Final is ...

|__+_|

In het catch-blok van de syntaxis ziet u het [fouttype]. Hier specificeert u het type fout dat u in dit blok wilt opvangen.

Als u bijvoorbeeld UnauthorizedAccessException-fouten wilt opvangen, gebruikt u de onderstaande instructies...

|__+_|

Als u de opdracht in PowerShell wilt uitvoeren, geeft u de instructies op één regel op. Het eerste deel van de instructie - $error.Clear() - wist eventuele fouten die zijn opgeslagen in de $error-variabele.

|__+_|

Meerdere toevoegen Vangst Blokken in een PowerShell Proberen te vangen Stelling

In de inleiding van dit gedeelte heb ik u laten zien hoe u een specifiek type uitzondering kunt opvangen in de Vangst blok. U kunt meerdere opgeven

Hier is een voorbeeld…

|__+_|

In dit voorbeeld is de eerste vangst block verwerkt de gespecificeerde typen uitzonderingen. Bovendien is de tweede vangst blokhandles verwerkt generieke fouten.

Hoe u een foutuitzondering kunt extraheren met PowerShell Probeer Catch

De laatste subsectie behandelde het specificeren van meerdere catch-blokken om verschillende soorten uitzonderingen af ​​te handelen. In deze subsectie leert u hoe u de foutdetails in een uitzondering kunt extraheren.

Om dit te illustreren, zal ik een voorbeeld gebruiken dat ik eerder heb gebruikt. Voer deze Power shell-instructie uit in Power shell.

|__+_|

Voer nu de $ fout alleen uit ...

|__+_|

Hoewel er meerdere informatie wordt opgeslagen in de $error-variabele, wordt de daadwerkelijke foutmelding gemarkeerd in de onderstaande schermafbeelding.

Hoe u foutdetails kunt extraheren met PowerShell Probeer Catch

Als u deze fout in een tekstbestand wilt loggen, hoeft u alleen de feitelijke foutdetails te loggen. Gebruik de onderstaande opdracht om deze fout te extraheren:

|__+_|

De opdracht extraheert de eigenlijke foutmelding Toegang tot het pad 'D:PS-Tutorialfolder-names.txt' is geweigerd.

U kunt deze foutmelding in een logbestand schrijven door a Uit-bestand commando in het Catch-blok.

|__+_| ik heb de toevoegen parameter in de Uit-bestand commando om het loggen van meerdere items toe te staan ​​zonder de vorige items te overschrijven.

Om het laatste commando gemakkelijk te begrijpen, zal ik het herschrijven in het onderstaande scriptformaat...

|__+_|

Hoe A . op te nemen Eindelijk Blokkeren naar PowerShell Proberen te vangen Stelling

Hoe u een laatste blokkering kunt toevoegen aan PowerShell Try Catch-statement?

U kunt een Eindelijk blok naar PowerShell Proberen te vangen Stelling. De syntaxis is

|__+_|

De Tenslotte block kan worden gebruikt om bronnen vrij te maken die niet langer nodig zijn voor het script.

Een Eindelijk-blok wordt uitgevoerd, zelfs als u CTRL+C gebruikt om het script te stoppen. Het blok wordt ook uitgevoerd als een Exit-trefwoord het script stopt vanuit een Catch-blok.

In het laatste voorbeeld had ik de instructie die het foutenlogboek schrijft naar een tekstbestand in de Vangst blok. De beste plaats om die verklaring te hebben is echter in een Eindelijk blok.

Zie het aangepaste script hieronder...

|__+_|

Aanvullende nuttige informatie over PowerShell Probeer Catch

Andere belangrijke informatie over PowerShell Probeer

In deze sectie zal ik enkele eenvoudige maar nuttige informatie delen over PowerShell Try Catch.

Hoe PowerShell te wissen Probeer Catch $Error Automatic Variable

De automatische variabele $error heeft een Duidelijk Methode. U kunt deze methode gebruiken om alle fouten te wissen die zijn opgeslagen in de automatische variabele $error.

Voer de onderstaande opdracht uit om alle fouten te wissen die zijn opgeslagen in de automatische variabele $error voor de huidige PowerShell-sessie.

|__+_|

Een aangepast foutbericht weergeven in PowerShell Probeer Catch Block

Gebruik het woord Throw om een ​​aangepast foutbericht weer te geven in een PowerShell Try Catch Block. Hier is een voorbeeld…

|__+_|

Hier is het resultaat van dit script in Power shell ISE .

Een aangepast foutbericht weergeven in PowerShell Probeer Catch Block

Hoe u Error CategoryInfo-informatie in PowerShell kunt krijgen Probeer Catch

De automatische variabele $error heeft een eigenschap genaamd CategoryInfo. Voer de onderstaande opdracht uit om deze eigenschap en andere eigenschappen en methoden te zien...

camera foutcode 0xa00f4243
|__+_|

Een van de eigenschappen die door de laatste opdracht zijn geretourneerd, wordt aangeroepen CategorieInfo .

Voer de onderstaande opdracht uit om toegang te krijgen tot deze informatie.

|__+_|

Deze opdracht retourneert meerdere subeigenschappen.

Hoe u Error CategoryInfo-informatie in PowerShell kunt krijgen Probeer Catch

Elk van deze sub-eigenschappen is toegankelijk door de naam van de sub-eigenschappen na een punt toe te voegen. Als u bijvoorbeeld de subeigenschappen van Reden wilt weergeven, voert u de onderstaande opdracht uit.

|__+_|

Hoe Write-Host te gebruiken om foutmeldingen in PowerShell weer te geven Probeer Catch

Net als de eigenschap CategoryInfo in de laatste subsectie, heeft de automatische variabele $error ook een eigenschap genaamd Uitzondering . Voer de onderstaande opdracht uit om de uitzondering in een fout weer te geven:

|__+_|

Helaas, als u deze informatie probeert weer te geven met het Write-Host-commando, werkt het niet zoals verwacht.

|__+_|

Hier is het resultaat van deze opdracht in PowerShell...

Hoe Write-Host te gebruiken om foutmeldingen in PowerShell weer te geven Probeer Catch

Zoals u kunt zien, geeft de opdracht een heleboel andere informatie weer. Het goede nieuws is dat $fout.Uitzondering heeft een andere eigenschap genaamd Bericht .

U kunt deze sub-eigenschap aanroepen door deze toe te voegen aan $fout.Uitzondering , soortgelijk…

|__+_|

Daarnaast kunt u gebruik maken van Schrijf-host opdracht om deze foutinformatie weer te geven...

|__+_|

De laatste opdracht geeft nu de daadwerkelijke foutmelding weer...

Behalve dat er een specifieke reden is om te gebruiken Schrijf-host zoals getoond in de laatste opdracht, kunt u eenvoudig dezelfde foutmelding weergeven met $fout.Uitzondering opdracht.

Hoe maak je een hashtabel in een PowerShell Probeer Catch Block

Er zijn twee veelvoorkomende manieren om een PowerShell-hashtabel in een Try Catch-blok.

  1. U kunt een hashtabel maken met meerdere sleutel/waarde-paren binnen het Try-blok
  2. Als alternatief kunt u een enkele sleutel/waarde-hashtabel maken met de Sleutel buiten de Probeer Catc h blok en de waarde binnen de Probeer Catc h blok.

Hier is een voorbeeld van de eerste methode...

|__+_|

Zoals je kunt zien, bevindt de hasttabel zich binnen de Probeer Catc h blok…

Aan de andere kant kunt u een enkele hashtabel-sleutel maken met de waarde gedefinieerd binnen a Probeer Catc h blok. Hier is een voorbeeld…

|__+_|

Om te bevestigen dat het laatste script een PowerShell-hashtabel produceert, heb ik na het uitvoeren van het script de waarden aangeroepen die zijn opgeslagen in de $hashtable-variabele.

Zoals je kunt zien aan het resultaat van het laatste commando, heeft het een Naam/Waarde-paar!

PowerShell Probeer voorbeelden te vangen

PowerShell Probeer voorbeelden te vangen

In deze laatste sectie zal ik meerdere voorbeelden behandelen van de toepassing van PowerShell Try Catch.

Hoe PowerShell te gebruiken Proberen te vangen Met Get-Childitem

De opdracht Get-Childitem kan meerdere fouten retourneren. Om de twee veelvoorkomende fouten te illustreren, zal ik de twee onderstaande commando's gebruiken:

|__+_|

Het juiste pad naar het tekstbestand dat in de laatste opdracht is gebruikt, is D:PS-Tutorialfilelist.txt.

In het eerste commando heb ik echter een spatie toegevoegd na D:PS-Tutorial. Dit resulteerde in een fout (We zullen de foutdetails binnenkort bepalen).

Ook heb ik in de tweede opdracht het juiste pad opgegeven, maar de verkeerde bestandsnaam gebruikt. Dit resulteerde in een fout.

|__+_| Hoe PowerShell te gebruiken Probeer Catch With Get-Childitem

Verderop, om meer informatie over deze fouten te krijgen, zal ik de opdrachten in een PowerShell uitvoeren Proberen te vangen blok.

|__+_|

Onze eerste taak is het bepalen van de soorten fouten die door de opdrachten worden geretourneerd. Voer de onderstaande opdrachten uit om deze informatie te krijgen ...

|__+_|

Hier zijn de resultaten van de commando's...

Hoe PowerShell te gebruiken Probeer Catch om Get-WMIObject-fouten te exporteren met Export-csvFouten die zijn opgeslagen in de automatische variabele $error worden opgeslagen in een PowerShell-array. Elk object in de array is toegankelijk door een [0], [1] toe te voegen aan het einde van de array. 0 staat voor het eerste item in de array, terwijl 1 staat voor het tweede item, enzovoort.

Terug naar meer informatie over de fouten die worden veroorzaakt door de Get-Childitem commando, op basis van de fouttypen, kunnen we ons Try Catch-blok wijzigen om deze 2 soorten fouten vast te leggen ...

|__+_|

Onze tweede taak is om de daadwerkelijke foutmeldingen weer te geven. Deze opdracht zal het werk doen:

|__+_|

De opdracht geeft de twee foutmeldingen weer...

Hoe PowerShell te gebruiken Proberen te vangen Get-WMIObject-fouten exporteren met Export-csv

In deze subsectie zal ik fouten exporteren die zijn gegenereerd tijdens het uitvoeren van Get-WMIO-object op een externe computer naar een CSV-bestand met de Export-csv opdracht.

Laten we eerst eens kijken naar de foutdetails die worden gegenereerd wanneer u verbinding probeert te maken met een offline externe computer met Get-WMIO-object . Voer de onderstaande opdracht uit om dit te illustreren ...

|__+_|

De opdracht genereerde een foutmelding omdat: Computer is geen geldige pc-naam.

Hoe u Get-Proces-fouten kunt opvangen met PowerShell Probeer Catch Statement

Verderop, om de fout te beheren, zal ik de opdracht uitvoeren binnen de Poging blok van een Proberen te vangen stelling.

|__+_|

In de eerste regel van de Poging blok, heb ik de variabele $ ComputerName gedefinieerd. Toen, in de tweede regel, rende ik de Get-WmiObject opdracht.

Verder is in de Vangst blok, ik heb de foutdetails gemaakt en deze naar een CSV-bestand geëxporteerd met Export-csv .

Hier is een gedetailleerde uitleg van het script in de Poging blok:

  1. In regel 1 heb ik een $path-variabele gemaakt die aangeeft waar ik het CSV-bestand wil opslaan
  2. Vervolgens gebruikte ik in regel 2 de opdracht Get-Date om een ​​bestandsnaam voor het CSV-bestand te maken. De bestandsnaam is in het formaat, jjjjMMdd_UHmmss.csv
  3. In regel 3 heb ik een leeg object gemaakt dat is opgeslagen in een variabele met de naam $data
  4. Vervolgens heb ik in regel 4 de kolom 'Computernaam' toegevoegd aan het object dat ik in regel 3 heb gemaakt. De kolom heeft de variabele $ ComputerName
  5. In regel 5 heb ik het volume 'Error Message' toegevoegd dat de foutmeldingen zal opslaan, $fout.Uitzondering.Bericht
  6. Vervolgens heb ik in regel 6 een $csvfilepath-variabele gemaakt die de $path- en $csvfilename-variabelen combineert om een ​​volledig pad naar het CSV-bestand te maken
  7. Ten slotte heb ik in regel 7 de informatie die is opgeslagen in de $data-variabele ($ComputerName en $error.Exception.Message) doorgesluisd naar Export-csv en het bestand opgeslagen in $csvfilepath
De NoTypeInformatie parameter in de opdracht Export-csv verwijdert typegegevens. Voor meer informatie, lees onze gids Powershell NoTypeInformation: toepassingen en voorbeelden

De onderstaande schermafbeelding toont de CSV die door het script is gemaakt ...

Hoe u Get-Proces-fouten kunt opvangen met PowerShell Proberen te vangen Stelling

Als u de opdracht Get-Process uitvoert met een proces-ID die niet bestaat, wordt a . geretourneerd Microsoft.PowerShell.Commands.ProcessCommandException fout.

Om dit specifieke type uitzondering vast te leggen, voert u een opdracht uit die vergelijkbaar is met die hieronder:

|__+_|

Hier is het resultaat van het script in Power shell ISE.

Als alternatief kunt u een aangepast foutbericht definiëren door het script aan te passen zoals hieronder wordt weergegeven...

|__+_|

Nu retourneert het script het aangepaste foutbericht ...

Hoe u Get-Mailbox-fouten kunt opvangen met PowerShell Proberen te vangen Stelling

Als u verbinding maakt met Office 365 PowerShell en de Ontvang-mailbox tegen een gebruiker die niet bestaat, krijgt u een foutmelding. Sommige gebruikers hebben gemeld dat ze problemen hebben met het vastleggen van de foutmelding in Ontvang-mailbox opdracht.

Om dit scenario te testen, na verbinding te hebben gemaakt met onze Office 365-account via PowerShell heb ik het onderstaande script uitgevoerd:

|__+_| De gebruiker Pius bestaat niet in ons Office 365-account.

Het script heeft de foutmelding geretourneerd De bewerking kon niet worden uitgevoerd omdat object 'Pius' niet kon worden gevonden op 'AM6PR05A05DC002.EURPR05A005.PROD.OUTLOOK.COM '.

Hier is de schermafbeelding...

Echter, als Proberen te vangen de fout niet opvangt, probeer dan het uitzonderingstype toe te voegen zoals weergegeven in de gewijzigde opdracht hieronder:

|__+_|

Dat is het - onze uitgebreide en bijgewerkte gids over PowerShell Probeer Catch Final ly! Ik hoop dat je het nuttig vond?

Als je het nuttig vond, stem dan vriendelijk Ja op de Was dit bericht Nuttige vraag hieronder.

U kunt ook een vraag stellen, een opmerking achterlaten of meer feedback geven met het formulier 'Een antwoord achterlaten' aan het einde van deze pagina.

Bezoek ten slotte onze Windows PowerShell How-To-gidspagina voor meer PowerShell tech S-zones. Misschien vindt u onze pagina Werken vanaf de startpagina ook erg nuttig.

Referenties en verder lezen

  1. Over Probeer eindelijk eens te vangen
  2. Over Trap
  3. PowerShell-array en toevoegen aan array: toepassingen en voorbeelden
  4. Powershell For Loop uitgelegd: syntaxis en voorbeelden