PowerShell & Scripting
Scriptblock (Skriptblock)
Allgemeine Infos
Ein Scriptblock ist eine Anweisungsliste in geschweiften Klammern, etwa { Get-Process }. PowerShell behandelt ihn als Objekt vom Typ ScriptBlock. Du kannst ihn in einer Variable speichern, als Parameter übergeben und beliebig oft ausführen. Ein Scriptblock gibt die Ausgabe aller enthaltenen Befehle zurück. return beendet ihn, unterdrückt aber keine bereits erzeugte Ausgabe.
Scriptblocks begegnen Dir überall: als Filter in Where-Object, als Aktion in ForEach-Object, als Remote-Code in Invoke-Command, in Pester-Tests, in Start-Job und in eigenen Funktionen. Mit einem param-Block erhalten sie benannte Parameter, außerdem können sie begin-, process- und end-Blöcke enthalten.
Abgrenzung: Nicht jede geschweifte Klammer ist ein Scriptblock. Die Rümpfe von if oder for sind Anweisungsblöcke und erzeugen keinen eigenen Variablenbereich.
Funktionsweise & Details
Ausführung und Übergabe:
- Aufruf mit dem Call-Operator: & $sb führt den Scriptblock in einem untergeordneten Bereich aus, Parameter übergibst Du wie bei einer Funktion.
- Invoke-Command -ScriptBlock $sb -ArgumentList ... bindet Werte positionsweise an den param-Block, auch auf entfernten Rechnern.
- Delay-Bind: Parameter, die Pipeline-Eingaben annehmen, akzeptieren einen Scriptblock, der je Objekt ausgewertet wird. Beispiel: Rename-Item -NewName { "old_$($_.Name)" }. Der Parametername muss dabei ausdrücklich angegeben werden.
- In Remote-Sitzungen, Jobs und ForEach-Object -Parallel greifst Du mit $using:Variable auf Variablen des Aufrufers zu, ohne $using: sind sie dort unbekannt.
- Script Block Logging protokolliert den Inhalt verarbeiteter Scriptblocks im Ereignisprotokoll (Ereignis-ID 4104).
Vorteile & Nutzen
- Wiederverwendbare Logik: Einmal definierte Filter oder Aktionen lassen sich an mehrere Befehle übergeben
- Grundlage für Remoting und Jobs: Code wird als Einheit an andere Rechner oder Prozesse geschickt
- Delay-Bind spart Schleifen: Pro Objekt berechnete Parameterwerte ersetzen ein separates ForEach-Object
- Klare Kapselung: param-Block und eigener Bereich verhindern, dass Variablen ungewollt überschrieben werden
Praxisbeispiel
Ein Krankenhaus mit 1.200 Mitarbeitenden prüft auf 60 Servern regelmäßig freie Plattenkapazität. Der Admin definiert die Prüflogik einmal als Scriptblock mit param-Block für den Schwellenwert und übergibt ihn per Invoke-Command an alle Server. Den Schwellenwert reicht er mit $using: aus der lokalen Sitzung durch. Änderungen an der Prüfung erfolgen an genau einer Stelle.
Worauf sollte man achten?
- Lokale Variablen in Remote-Scriptblocks immer mit $using: übergeben, sonst sind sie auf dem Zielsystem leer
- Keine Scriptblocks aus ungeprüften Zeichenketten erzeugen ([scriptblock]::Create mit Benutzereingaben), das öffnet Code-Injection
- Bei Delay-Bind den Parameternamen ausschreiben, sonst bindet PowerShell den Scriptblock nicht
- Script Block Logging aktivieren, damit ausgeführter Code auch bei verschleierten Skripten nachvollziehbar ist
Fazit
Scriptblocks sind ein Grundbaustein von PowerShell, ohne den Remoting, Filter und Tests nicht funktionieren. Wer $using: und Delay-Bind beherrscht, schreibt kürzeren und robusteren Code.
Weiterführende Links
Verwandte Artikel
Windows Server
Secure Boot Zertifikate 2026: Prüfung per PowerShell
PHscripts.de | PSscripts.de
PS > PowerShell 7: Vergleich zu PowerShell 5
Windows Server
Windows Server 2016 | Noch 88 Tage Updates
PowerShell