PowerShell-Grundlagen: So spart man Zeit bei der Administration in Windows

PowerShell-Skripte bieten eine praktische Möglichkeit, um verschiedene Routineabläufe zu automatisieren. ZDNet stellt zehn grundlegende Routinen vor, die Einsteigern bei der Entwickelung eigener Skripte Unterstützung bieten.

1. PS1-Dateien

Ein PowerShell-Skript ist im Grunde nichts anderes als eine einfache Textdatei. Die Datei enthält eine Reihe von PowerShell-Befehlen, wobei jeder Befehl in einer separaten Zeile erscheint. Um die Textdatei als PowerShell-Skript einsetzen zu können, muss der Dateiname die Erweiterung .PS1 besitzen.

2. Ausführungsberechtigungen

Um die Ausführung bösartiger Skripts zu verhindern, wendet PowerShell eine Ausführungsrichtlinie an. Standardmäßig ist die Ausführungsrichtlinie auf Restricted gesetzt, was bedeutet, dass PowerShell-Skripts nicht ausgeführt werden. Man kann mit folgendem Cmdlet bestimmen, welche Ausführungsrichtlinie aktuell angewandt wird:

Get-ExecutionPolicy

Zur Wahl stehen folgende Ausführungsrichtlinien:

  • Restricted – Skripts werden nicht ausgeführt.
  • RemoteSigned – lokal erstellte Skripts werden ausgeführt, aus dem Internet heruntergeladene dagegen nicht (außer sie sind von einem vertrauenswürdigen Herausgeber digital signiert).
  • AllSigned – Skripts werden nur dann ausgeführt, wenn sie von einem vertrauenswürdigen Herausgeber signiert sind.
  • Unrestricted – Skripts werden ausgeführt, egal woher sie stammen und ob sie signiert sind.

Mit folgendem Cmdlet lässt sich die Ausführungsrichtlinie für PowerShell festsetzen:

Set-ExecutionPolicy

3. Ausführen eines Skripts

Jahrelang bestand das Vorgehen zur Ausführung einer ausführbaren Datei darin, dass man zum Dateipfad navigieren und den Namen der ausführbaren Datei eingeben konnte. Diese althergebrachte Methode funktioniert allerdings bei PowerShell-Skripts nicht.

Wer ein PowerShell-Skript ausführen will, muss normalerweise den gesamten Pfad zusammen mit dem Dateinamen eingeben. Beispielsweise bietet sich für ein Skript namens SCRIPT.PS1 Folgendes an:

C:ScriptsScript.ps1

Die große Ausnahme besteht darin, dass sich ein Script ausführen lässt, indem man einfach seinen Namen eingibt, wenn sich der Ordner mit dem Skript im Pfad des verwendeten Systems befindet. Wer sich bereits in dem Ordner mit dem Skript befindet, kann auch die Abkürzung nehmen. Statt also den gesamten Pfad des Skripts zu schreiben, lässt sich in einem solchen Fall . zusammen mit dem Namen des Skripts eingeben. Beispielsweise ließe sich Folgendes schreiben:

.Script.ps1

4. Pipelining

Pipelining bedeutet, dass der Output eines Befehls in einen anderen Befehl geladen wird. So kann der zweite Befehl auf den erhaltenen Input reagieren. Um zwei Befehle (oder Cmdlets) in eine Pipeline zu setzen, muss man sie einfach mit dem Pipe-Symbol (|) trennen.

Um zu verstehen, wie das Pipelining funktioniert, kann man sich vorstellen, dass eine Liste von auf einem Server ausgeführten Prozessen erstellt und dann im Anschluss nach der Prozess-ID-Nummer sortiert werden soll. Mit dem Cmdlet Get-Process lässt sich eine Liste von Prozessen aufrufen, allerdings ist diese nicht sortiert. Wird aber der Output des Cmdlet in einer Pipeline in den Befehl Sort-Object ID geladen, wird die Liste sortiert. Der dazu verwendete Befehlsstring sieht wie folgt aus:

.Get-Process | Sort-Object ID

5: Variablen

Durch Pipelining kann der Output eines Befehls in einen anderen Befehl geladen werden, aber mitunter reicht das Pipelining allein nicht aus. Wenn man den Output eines Befehls in einen anderen Befehl lädt, wird dieser Output sofort verwendet. Manchmal muss aber vielleicht der Output eine Weile gespeichert werden, um ihn dann später verwenden (oder wiederverwenden) zu können. Hier kommen die Variablen ins Spiel.

Eine Variable lässt sich natürlich grundsätzlich zur Speicherung eines Werts verwenden, aber in PowerShell kann eine Variable den kompletten Output eines Befehls speichern. Zum Beispiel will man vielleicht die Liste der auf einem Server ausgeführten Prozesse als Variable speichern. Dazu ließe sich die folgende Code-Zeile verwenden:

$a = Get-Process

Hier wird die Variable als $a bezeichnet. Wer die Variable benutzen will, ruft sie einfach mit ihrem Namen auf. Gibt man also beispielsweise $a ein, wird der gesamte Inhalt der Variablen auf dem Bildschirm angezeigt.

Eine Variable lässt sich für den endgültigen Output mehrerer, über eine Pipeline verknüpfter Befehle zuweisen. Dabei müssen lediglich die Befehle in Klammern gesetzt werden. Um zum Beispiel die ausgeführten Prozesse nach ihrer Prozess-ID zu sortieren und anschließend den Output einer Variable zuzuweisen, bietet sich folgender Befehl an:

$a = (Get-Process | Sort-Object ID)

6. Das @-Symbol

Mit dem @-Symbol kann man die Inhalte einer Liste in ein Array verwandeln. Zum Beispiel erstellt die folgende Code-Zeile eine Variable namens $procs, die mehrere Textzeilen (ein Array) umfasst:

$procs = @{name=“explorer“,“svchost“}

Das @-Symbol lässt sich auch verwenden, wenn die Variable verwendet wird, um sicherzustellen, dass sie als Array und nicht als einzelner Wert gehandhabt wird. Die Code-Zeile unten führt beispielsweise das Cmdlet Get-Process gegen die soeben definierte Variable aus. Auf diese Weise zeigt Windows alle Prozesse an, die von Windows Explorer und Svchost verwendet werden. Zu beachten ist dabei, wie das @-Symbol anstelle des üblichen Dollarzeichens vor dem Variablennamen benutzt wird:

Get-Process @procs

7. Split

Der Split-Operator teilt einen Textstring anhand eines festgesetzten Zeichens. Soll zum Beispiel einen Satz in ein Array aufgeteilt werden, das aus jedem einzelnen Wort des Satzes besteht, könnte man dies mit einem Befehl wie dem folgenden erreichen:

„Dies ist ein Test“ -split “ „

Das Ergebnis würde dann so aussehen:

Dies ist ein Test

8. Join

So wie der Split-Operator einen Textstring in mehrere Teile zerlegen kann, so kann der Join-Operator mehrere Textblöcke zu einem Block zusammensetzen. Beispielsweise wird die folgende Zeile einen Textstring ergeben, die aus dem Vor- und Nachnamen des Autors besteht:

„Brien“,“Posey“ -join “ „

Das Leerzeichen zwischen den Anführungszeichen am Schluss weist Windows an, ein Leerzeichen zwischen die beiden Textstrings zu setzen.

9. Haltepunkte

Das Ausführen eines neu erstellten PowerShell-Skripts kann unbeabsichtigte Auswirkungen haben, wenn das Skript Fehler enthält. Um sich hiervor zu schützen, besteht die Möglichkeit Haltepunkte an strategischen Stellen im Skript setzen. Auf diese Weise lässt sich überprüfen, ob das Skript wie beabsichtigt funktioniert, bevor man es vollständig ausführt.
Die einfachste Möglichkeit zum Setzen eines Haltepunkts ist die Zeilennummer. Um beispielsweise einen Haltepunkt an der zehnten Zeile eines Skripts zu setzen, ließe sich ein Befehl wie der folgende verwenden:

New-PSBreakpoint -Script C:ScriptsScript.ps1 -Line 10

Ein Haltepunkt lässt sich auch mit einer Variablen verknüpfen. Wer zum Beispiel sein Skript immer dann anhalten möchte, wenn sich die Inhalte eines a$ ändern, könnte dazu einen Befehl wie den folgenden verwenden:

New-PSBreakpoint -Script C:scriptsScript.ps1 -variables a

Hierbei ist zu beachten, dass nach dem Variablennamen kein Dollarzeichen eingefügt wurde.

Es gibt verschiedene Ausdrücke, die sich zusammen mit PSBreakpoint verwenden lassen, darunter New, Get, Enable, Disable und Remove.

10. Step

Beim Debuggen eines Skripts kann es mitunter erforderlich sein, das Skript zeilenweise auszuführen. Dazu bietet sich der Einsatz des Cmdlet Step-Into an. Es sorgt dafür, dass das Skript nach jeder Zeile anhält, auch wenn kein Haltepunkt existiert. Anschließend lässt sich das Cmdlet Step-Out benutzen, um das schrittweise Durchgehen des Skripts zu beenden. Wichtig ist dabei jedoch, dass Haltepunkte auch dann noch verarbeitet werden, wenn man das Cmdlet Step-Out benutzt hat.
Für ein Skript, das Funktionen verwendet, eignet sich das Cmdlet Step-Over. Step-Over funktioniert wie Step-Into, nur dass beim Aufrufen einer Funktion Windows diese nicht schrittweise durchgeht. Vielmehr wird die gesamte Funktion ohne Unterbrechung ausgeführt.

ZDNet.de Redaktion

Recent Posts

Microsoft verschiebt erneut Copilot Recall

Die Entwickler arbeiten noch an weiteren „Verfeinerungen“. Windows Insider erhalten nun wohl eine erste Vorschau…

15 Stunden ago

GenKI im Job: Mitarbeitende schaffen Tatsachen

Laut Bitkom-Umfrage werden in jedem dritten Unternehmen in Deutschland private KI-Zugänge genutzt. Tendenz steigend.

17 Stunden ago

97 Prozent der Großunternehmen melden Cyber-Vorfälle

2023 erlitten neun von zehn Unternehmen in der DACH-Region Umsatzverluste und Kurseinbrüche in Folge von…

18 Stunden ago

„Pacific Rim“-Report: riesiges, gegnerisches Angriffs-Ökosystem

Der Report „Pacific Rim“ von Sophos beschreibt Katz-und-Maus-Spiel aus Angriffs- und Verteidigungsoperationen mit staatlich unterstützten…

21 Stunden ago

DeepL setzt erstmals auf NVIDIA DGX SuperPOD mit DGX GB200-Systemen

NVIDIA DGX SuperPOD soll voraussichtlich Mitte 2025 in Betrieb genommen und für Forschungsberechnungen genutzt werden.

21 Stunden ago

Latrodectus: Gefährlicher Nachfolger von IcedID

Latrodectus, auch bekannt als BlackWidow, ist auch unter dem Namen LUNAR SPIDER bekannt.

22 Stunden ago