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

Die PowerShell kann viel Zeit bei Administrationsaufgaben unter Windows einsparen. Um sie effektiv einzusetzen, muss man die Funktionsweise jedoch genau verstehen. ZDNet hat die Grundlagen von PowerShell zusammengefasst.

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.

Themenseiten: Microsoft, Plattform, Software, Windows, Windows 7, Windows Vista, Windows XP

Fanden Sie diesen Artikel nützlich?
Content Loading ...
Whitepaper

Artikel empfehlen:

Neueste Kommentare 

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

Kommentar hinzufügen
  • Am 23. April 2011 um 12:28 von JensE

    PowerShell | more
    Moin,

    als Windows user ist man ja froh, dass irgend etwas an der alten DOS Konsole mal verbessert (alias: komplett in die Mülltonne getreten ;o) ) wurde. Diese Shell war zu allen Zeiten ein Krampf.

    Nun muss ich aber konstatieren, dass es einen besseren Weg gibt. Un der wäre ‚msys‘ und ‚ActivePerl‘ zu installieren.

    Als intensiver Nutzer Konsolen basierter Skripte ist es einfach simpler sich auf etablierte und gut durchdachte Konzepte zu verlassen. ‚bash‘ und ‚perl‘ können das was die PowerShell kann schon seit Jahrzehnten. Dem entsprechend gibt es für viele Dinge schon Lösungen.

    Ergo: Man muss das Rad eben nicht immer neu erfinden … obwohl … sonst hätte microsoft ja eigentlich nicht solch einen Erfolg! :o)

    Bis denn
    JensE

  • Am 19. August 2012 um 13:25 von RiPu

    Das Beispiel für Pipelining „.Get-Process | Sort-Object ID“ ist leider nicht ganz korrekt.

    Get-Process ist, wie im Text korrekt angegeben, ein CMDLet und kein Script.

    Scripte führt man mit einem vorangehende Punkt aus, CMDLets hingegen nicht, daher ist das angegebene Beispiel nicht funktional.

    Dennoch eine sehr gute Einführung für Einsteiger wie mich. Danke!

  • Am 17. August 2016 um 17:36 von Roman

    Sollte nicht im Punkt 9. Haltepunkte der Befehl Set-PSBreakpoint heißen?
    New-PSBreakpoint funktioniert bei mir nicht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *