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
Schütze deine PowerShell-Skripte vor Fehlkonfigurationen. Hier findest du eine typsichere Methode zum Importieren externer Informationen in deine Skripte.
Im letzten Schritt unserer Miniserie fügen wir dem Lesen von Daten aus *.psd1 Robustheit und Widerstandsfähigkeit hinzu: Das Skript, das die *.psd1-Datei liest, wendet eine einfache, aber leistungsstarke Typüberprüfung an. Keine böswillige Person (oder ein unerfahrener Auszubildender) kann unerlaubte Schlüssel hinzufügen, Tippfehler lösen sofort eine Warnung aus, und erhalte Typsicherheit: Daten, die als Array (Liste) gedacht sind, bleiben ein Array, auch wenn die *.psd1-Datei nur einen (oder keinen) Wert für diesen Schlüssel definiert.
Wir versuchen, das noch zu verbessern. Hier ist wieder die *.psd1-Datei. Diesmal habe ich das Präfix "data" aus den Schlüsseln entfernt, da dieses Präfix nicht mehr benötigt wird, wenn alle Informationen in einem Objekt gespeichert sind, und die Datei als data_new.psd1 gespeichert:
@{
# Pfade zu wichtigen Ordnern
InPath = 'c:\data1', '\\server2\public\data'
OutPath = '\\server99\public\results'
LogPath = 'f:\local\log'
# AD-Gruppen
Groups = 'Technicians', 'Testers', 'Auditors'
# Diverse Einstellungen
TimeoutSeconds = 5400
LogLevel = 4
}
Hier siehst du, wie wir zuvor die *.psd1-Datei geladen und ihre Informationen in ein Objekt umgewandelt haben (stelle sicher, dass sich beide Dateien im selben Ordner befinden):
# data.psd1 muss sich im gleichen Ordner befinden
$dataPath = Join-Path -Path $PSScriptRoot -ChildPath data_new.psd1
# Hash-Tabellenschlüssel in Variablen umwandeln
$hashObject = [PSCustomObject](Import-PowerShellDataFile -Path $dataPath)
Das funktionierte gut, aber es gab keine strikte Typdeklaration, die die importierten Daten schützte und sicherstellte, dass sie tatsächlich auf die richtige Weise strukturiert waren.
Dank der (in Windows PowerShell 5 hinzugefügten) Klassen ist das Hinzufügen sehr einfach: Füge deinem Skript eine Klasse hinzu, die die Reihenfolge und den Datentyp der Objekteigenschaften festlegt, und übertrage das Objekt dann auf diese Klasse.
Zusatztipp: Verwende für numerische Listen wie "LogLevel" entweder den Datentyp [int], oder füge besser noch eine Aufzählung mit freundlichen Namen hinzu, die die zulässigen numerischen Werte auf eine feste Liste beschränkt (siehe unten):
enum LogLevel
{
Information = 1
Verbose = 2
Debug = 3
All = 4
}
# Definieren die Struktur deiner Eingabedaten
class configDataScript1
{
# Pfade
[string[]]$InPath
[string[]]$OutPath
[string]$LogPath
# AD-Gruppen
[string[]]$Groups
# Diverse Einstellungen
[int]$ZeitüberschreitungSekunden
[LogLevel]$LogLevel
}
# data.psd1 muss sich im gleichen Ordner befinden
$dataPath = Join-Path -Path $PSScriptRoot -ChildPath data_new.psd1
# sicheres Lesen der psd1-Datei (Achtung: unsichere Lesevorgänge können Code innerhalb der psd1-Datei ausführen)
[configDataScript1]$externalData = [PSCustomObject](Import-PowerShellDataFile -Path $dataPath)
$externalData
$externalData.GetType().FullName
Das Ergebnis kann sich sehen lassen: mit minimalem Aufwand hast du *.psd1-Dateien in eine leistungsfähige und typsichere Möglichkeit verwandelt, externe Informationen in deine Skripte zu importieren.
Extra-Tipp: Das Casting von Objekten in selbst erstellte Klassendefinitionen funktioniert mit einer Vielzahl von Daten. Du kannst die gleiche Technik zum Beispiel auf importierte CSV-Dateien anwenden. Vergewissere dich nur, dass die Klassendefinition genau mit den Namen deiner Eigenschaften übereinstimmt und dass jeder Eigenschaftswert tatsächlich in den Datentyp konvertiert werden kann, den die Klasse erfordert.
Jeder Tipp baut schrittweise darauf auf, eine verwaltbarere, effizientere und sicherere Methode zur Handhabung von Konfigurationsdaten in PowerShell-Skripten zu schaffen, wobei von einfachen Hash-Tabellen zu fortgeschritteneren typsicheren Objekten übergegangen wird.
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 24, 2024 by Aleksandar Nikolić und Dr. Tobias Weltner
Hier kommt die nächste Strategie zur Fehlerbehandlung, nachdem wir zuvor die Echtzeit und verzögerte Fehlerbehandlung...
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...
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.