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:
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.
Bankhaus Metzler und Telekom-Tochter MMS testen, inwieweit Bitcoin-Miner das deutsche Stromnetz stabilisieren könnten.
Mit 1,7 Exaflops ist El Capitan nun der dritte Exascale-Supercomputer weltweit. Deutschland stellt erneut den…
Der deutsche Hyperscaler erweitert sein Server-Portfolio um vier Angebote mit den neuen AMD EPYC 4004…
Beim Online-Gaming kommt es nicht nur auf das eigene Können an. Auch die technischen Voraussetzungen…
Fast jedes zweite Unternehmen bietet keinerlei Schulungen an. In den übrigen Betrieben profitieren oft nur…
Huawei stellt auf der Connect Europe 2024 in Paris mit Xinghe Intelligent Network eine erweiterte…