Müde vom Jonglieren mit der PowerShell-Fehlerbehandlung? Hier kommt ein Überblick über verschiedene Strategien, mit Fehlern umzugehen. Vereinfache dir die Arbeit! So werden aus Fehler-Objekten Daten-Objekte, mit denen Fehlerbehebung reibungsloser denn je wird.

Wandle Fehler (error objects) in hilfreiche Daten

In unserer Miniserie sind wir auf verschiedene Weise mit Ausnahmen in Berührung gekommen: über $_ in einem Catch-Block oder einer Trap, über $error oder separate Fehlervariablen, die mit -ErrorVariable definiert werden, oder durch Umleitung des Fehlerstroms in die Pipeline.

In all diesen Fällen erhalten Sie Fehlerobjekte. Hier ist eine generische Funktion, die Sie verwenden können, um alle diese Fehlerdatensätze einfach in praktische Datenobjekte zu konvertieren:



filter Convert-ErrorRecord

{

   [PSCustomObject]@{

       Exception = $_.Exception.Message

       Reason = $_.CategoryInfo.Reason
       Target = $_.CategoryInfo.TargetName

       Script = $_.InvocationInfo.ScriptName

       Line = $_.InvocationInfo.ScriptLineNumber

       Column = $_.InvocationInfo.OffsetInLine

   }

}

 

Diese Funktion ist in allen in dieser Serie besprochenen Fehlerbehandlungsprogrammen vorhanden.  

Zusammenfassend kann man sagen, dass alle vier, in diesem Monat behandelten Fehlerbehandlungsstrategien Convert-ErrorRecord verwenden, um die Ausnahmen in einfach zu handhabende Datenobjekte umzuwandeln. Stelle sicher, dass die obige Convert-ErrorRecord-Funktion definiert ist. Nachdem du sie ausgeführt hast, kannst du eines der folgenden Beispiele ausprobieren:

 

Mit try/catch:



try

{

    Write-Host 'Previous Command'

    $result = Get-ChildItem -Path $env:windir -Depth 1 -Filter *.log -ErrorAction Stop

    Write-Host 'Next Command'

}

catch

{

    $_ | Convert-ErrorRecord

}

 

Mit Trap:



Write-Host 'Previous Command'

$result = Get-ChildItem -Path $env:windir -Depth 1 -Filter *.log -ErrorAction Stop

Write-Host 'Next Command'



trap

{

   $_ | Convert-ErrorRecord

   continue

}

 

Mit $Fehler:



$error.Clear()



# Fehlermeldungen für den Benutzer ausblenden

$ErrorActionPreference = 'SilentlyContinue'



# Cmdlet-Aktionen ausführen, d.h. Protokolldateien finden

$result = Get-ChildItem -Path $env:windir -Depth 1 -Filter *.log 



# weitere Aktionen durchführen, z.B. auf einen Dienst zugreifen, der nicht existiert

$service = Get-Service -Name notThere 



# Standard-Fehleraktion wiederherstellen

$ErrorActionPreference = 'Continue'



# Fehler im Nachhinein überprüfen

$errorCount = $error.Count

Write-Host "Es gab $errorCount Fehler."



# Fehlerdetails ausgeben

$error | Convert-ErrorRecord

 

Mit Fehlerstrom (error strom):



Get-ChildItem -Path c:\windows -Depth 1 -Filter *.log 2>&1 | ForEach-Object {

  if ($_ -is [System.Management.Automation.ErrorRecord])

  {

    $text = $_ | Convert-ErrorRecord | Out-String

    Write-Host $text

  }

  else

  {

    $_

  }

}  

 

Das waren also alle vier Blogbeiträge im Oktober:  

 

Good2know

Dein ultimativer PowerShell-Spickzettel

Entfessele das volle Potenzial von PowerShell mit unserem praktischen Poster. Egal, ob frischer Einsteiger oder erfahrener Profi, dieser Spickzettel ist so konzipiert, dass du schnell die wichtigsten und am häufigsten verwendeten Cmdlets findest.

Das Poster ist zum Download und in Papierform erhältlich.

PowerShell Poster 2023

Hol dir hier dein Poster!

 

 

Weiterführende Links