3 min read
Skriptabbruch verhindern: PowerShell-Fehler clever behandeln
Da $error eine globale Variable ist, solltest du in Erwägung ziehen, eine eigene Protokollierungsvariable für die...
PowerShell-Erfolgsrezepte – die Profi-Tipps für effektives Scripting
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.
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:
try
{
Write-Host 'Previous Command'
$result = Get-ChildItem -Path $env:windir -Depth 1 -Filter *.log -ErrorAction Stop
Write-Host 'Next Command'
}
catch
{
$_ | Convert-ErrorRecord
}
Write-Host 'Previous Command'
$result = Get-ChildItem -Path $env:windir -Depth 1 -Filter *.log -ErrorAction Stop
Write-Host 'Next Command'
trap
{
$_ | Convert-ErrorRecord
continue
}
$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
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
{
$_
}
}
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.
Okt 17, 2024 by Aleksandar Nikolić und Dr. Tobias Weltner
Da $error eine globale Variable ist, solltest du in Erwägung ziehen, eine eigene Protokollierungsvariable für die...
Okt 10, 2024 by Aleksandar Nikolić und Dr. Tobias Weltner
Du bist mit try...catch vertraut? Exceptions kannst du mit Trap-Anweisungen behandeln. Kurz und knackig kommt hier der...
Okt 30, 2024 by Aleksandar Nikolić und Dr. Tobias Weltner
Verabschiede dich von fest codierten Pfaden und Einstellungen! Vereinfache deine PowerShell-Skripte, indem du...
Tobias Weltner und Aleksandar Nikolić haben gemeinsam die Blogpost-Reihe „Tobias&Aleksandars PowerShell-Tipps“ verfasst. Deshalb möchten wir euch beide hier vorstellen:
----------------------------
Aleksandar Nikolić ist ein Microsoft Azure MVP und Mitbegründer von PowerShellMagazine.com, der ultimativen Online-Ressource für PowerShell-Enthusiasten. Mit über 18 Jahren Erfahrung in der Systemadministration ist er ein angesehener Trainer und Redner, der rund um den Globus reist, um sein Wissen und seine Fähigkeiten über Azure, Entra und PowerShell weiterzugeben. Er hat auf IT-Veranstaltungen wie Microsoft Ignite, ESPC, NIC, CloudBrew, NTK und der PowerShell Conference Europe gesprochen.
----------------------------
Tobias ist ein langjähriger Microsoft MVP und war von Anfang an an der Entwicklung von PowerShell beteiligt. Er hat die PowerShell IDE „ISESteroids“ erfunden, zahlreiche Bücher über PowerShell für Microsoft Press und O'Reilly geschrieben, die PowerShell Conference EU (psconf.eu) gegründet und trägt derzeit als Mitglied der „Microsoft Cmdlet Working Group“ zur Weiterentwicklung der PowerShell bei. Tobias gibt sein Wissen als Berater in Projekten und als Trainer in Inhouse-Schulungen für zahlreiche Unternehmen und Agenturen in ganz Europa weiter.