ScriptRunner Blog
5 PowerShell Scripting Best Practices – vom lauffähigen zum professionellen Code
Inhaltsverzeichnis
Wie viel Zeit durftest du schon damit verbringen Code deiner Kollegen oder deines Vorgängers zu entschlüsseln? Oftmals versteckt sich hinter dem Code-Chaos gar keine Rocket Science, sondern simple Funktionen, die nur auf den ersten Blick komplex aussehen.
CodeGolfing ist vielleicht auf Reddit witzig und erspart in der Konsole Zeit, hat in professionellen Scripts aber nichts zu suchen. Vielmehr sollte man dem Konzept der Einfachheit folgen – das Motto heißt hier: „Dont make me think!“.
Eine Codezeile, bei der dein horizontaler Scrollbalken ins Schwitzen kommt, durch mehrere übersichtliche Codezeilen zu ersetzen wird deinen Kollegen viel Frust ersparen. In diesem Artikel zeige ich dir 5 Best Practices, mit denen du professionellen PowerShell Code schreibst, der dir Übersichtlichkeit, Stabilität und Kompatibilität bringt.
1. Ordentliche Formatierung
Der PowerShell-Interpreter kennt keine schöne Formatierung – sämtlicher Code wird stupide nacheinander abgearbeitet. Du könntest also theoretisch deinen gesamten Code in eine Zeile schreiben, solange du einzelne Statements mit einem „;“ trennst. Der Leserlichkeit ist damit aber definitiv nicht geholfen und spätestens wenn du zu einem späteren Zeitpunkt noch einmal an deinem Code arbeiten möchtest, wirst du diese Entscheidung bereuen.
Vor allem zu Beginn ihrer PowerShell-Karriere neigen User dazu keine Konsistenz in ihrer Formatierung zu haben. Hier ein direkter Vergleich zwischen unformatiertem Code (Abbildung 1) und formatiertem Code (Abbildung 2):
Wie du in Abbildung 2 siehst, geben Einrückungen deinem Text mehr Struktur und Scriptblöcke können optisch voneinander unterschieden werden. Ein Leerzeichen zwischen Operatoren (+, =, usw.) sorgt ebenso für besseren Überblick.
Beim Einleiten von Scriptblöcken gehen die Meinungen stark auseinander. Ich bin Fan vom „One True Brace Style“ – die öffnende geschweifte Klammer steht am Ende des einleitenden Statements, die schließende steht in einer separaten Zeile unter dem ersten Zeichen des einleitenden Statements. VSCode oder verschiedene Code-Beautifier können dir hier durch Auto-Format-Features manuelle Arbeit abnehmen.
2. Einsatz von Kommentaren
Sei ehrlich, auch du musstest schon deinen eigenen Code durchdenken, nachdem du ihn nach einem halben Jahr erweitern wolltest. Code-Kommentare geben dir und deinen Kollegen die Möglichkeit, Erklärungen zu einzelnen Funktionen als Notiz im Code zu hinterlassen.
Kommentare werden mit einem Hashtag/Raute/Doppelkreuz (Bezeichnungen aufsteigend nach Altersgruppe sortiert 😉) eröffnet.
Kommentare über mehrere Zeilen werden mit geöffnet und mit #> geschlossen (siehe Abbildung 3). Viele Editoren bieten auch Features an, um markierte Zeilen per Hotkey auszukommentieren (VSCode: Strg + Shift + 7):
Aber Achtung: Hier besteht die Gefahr des „Over Commenting“ – nicht alles im Code muss kommentiert werden. Überlege dir welche Code-Zeilen nicht auf den ersten Blick verständlich sind und fokussiere dich auf diese.
Neben den genannten Features können auch Funktionen durch Kommentare Metainformationen zugewiesen werden. Stichwörter an dieser Stelle sind „Parameterblock“ „Synopsis“ und „Notes“. Diese werden in der ScriptRunner ActionPacks vorbildlich gepflegt.
Durch diese Metainformationen können Hilfen über Get-Help abgefragt werden. Die Texte sind natürlich frei wählbar und auf die Modul- oder Funktionsinhalte anzupassen. Die Informationen sind hierbei in der jeweiligen Funktion zu pflegen. Ein Beispiel für eine Funktion, welche Dateien um eine Dateiendung ergänzt könnte zum Beispiel wie in Abbildung 4 aussehen:
3. Verwendung verständlicher Variablennamen und Konventionen
Ich bekenne mich schuldig – auch ich benutze hin und wieder $a, $b und manchmal sogar $c beim initialen Schreiben meiner Scripte. Aber nur im ersten Entwicklungsschritt.
Variablen-Namen sollten spätestens beim Release sprechend sein und ihren Inhalt offenbaren. Listen sollten im Plural, einzelne Elemente im Singular benannt werden – $user ist nun mal etwas anderes als $users.
PowerShell ist nicht Case-sensitive – das bedeutet aber nicht, dass du alle möglichen Variationen mischen solltest. Welche Konvention du wählst, bleibt dir überlassen – Hauptsache du bleibst dabei! Folgende Konventionen haben sich über sämtliche Sprachen hinweg durchgesetzt:
$snake_case
$PascalCase
$camelCase
$sHungarianNotation # 's' at beginning means 'String'
4. Kein Hard-Coding!
Hard-Coding in Scripts ist eines der schwerwiegendsten Anti-Pattern! Es macht deinen Code nicht nur adynamisch und starr, es kann auch ein gefährliches Sicherheitsrisiko darstellen!
Ich habe schon viele Admins kennengelernt, die Usernamen und sogar Passwörter oder Keys als Klartext in Scripts hinterlegt haben. Vielen fehlt es in dem Bereich an Know-how. Das Zauberwort in diesem Kontext heißt „Übergabe-Parameter“. Informationen können somit von außen an das Script weitergereicht werden:
5. Splatting von Parametern
In vielen Fällen benötigt man viele Parameter hinter einem Cmdlet. Das sieht nicht nur unschön aus, es führt auch oftmals dazu, dass Codezeilen sehr lang werden und man sich unelegant dem horizontalen Scrollbalken bedienen muss.
Hashtables können dabei helfen deinen Code ungemein zu vereinfachen. Die Technik, auf dich ich anspiele, nennt sich Splatting. Ziel dabei ist es, Parameter innerhalb von einer Hashtable zusammenzufassen.
Wenn wir beispielsweise einen Service-Owner über den Neustart seines Servers per Mail benachrichtigen möchten (siehe Abbildung 7), benötigen wir eine Vielzahl von Parametern (durch den „Back-Tic“ am Ende der ersten Zeile konnte ich den Code für den Screenshot auf zwei Zeilen strecken):
Fazit und Video
Diese genannten Best Practices stellen eine gute Grundlage für übersichtlichen Code dar. Vor allem Einsteiger und mittlere Fortgeschrittene sollten diese Praktiken aufgrund der oben genannten Vorteile direkt in ihren Code implementieren und sich nicht nur auf reine Funktionalität beschränken.
In vielen IT-Landschaften liegt außerdem Code-Standard vor – Scripts werden somit vor Veröffentlichung auf Konventionen und Qualität-Standards geprüft.
In meinem Video habe ich die 5 Best Practices noch mal zusammengefasst. Viel Spaß beim Zuschauen!
Zusammenhängende Posts
9 min read
Diese 10 Aufgaben löst du perfekt mit PowerShell für Microsoft Purview
Feb 27, 2024 by Damian Scoles
Über den Autor:
Philip Lorenz ist als DevOps- und Cloud-Engineer tätig. Neben dieser Tätigkeit hält er Schulungen und erstellt Lerninhalte rund um die Themen PowerShell, Automatisierung und Cloud-Computing.