PowerShell: Sprachkonstrukte (If/ElseIF/Else Anweisung) – Part 17.1
4.4 Sprachkonstrukte
Die Cmdlets und Befehle sowie die Pipeline, die in der PowerShell zur Verfügung stehen, bieten bereits sehr viele Möglichkeiten in der Shell. Um jedoch komplexere Funktionen und Skripte zu schreiben, bedarf es noch zusätzlich einiger Sprachelemente, welche wiederholtes Ausführen eines Skriptblocks oder logische Abzweigungen und Entscheidungen erlauben. Diese Sprachelemente, sogenannte Keywords oder reservierte Wörter, sind Teil der PowerShell Skriptsprache. Das impliziert, dass sie im Gegensatz zu Cmdlets, Befehlen und Funktionen nicht umdefiniert werden können. Es können auch keine Aliase zu den Keywords definiert werden. Eine Besonderheit der PowerShell Anweisungen ist, dass sie im Gegensatz zu allen anderen Shells auch Pipeline Elemente verarbeiten können.
In vielen Anweisungen werden sogenannte Anweisungsblöcke verwendet. Das sind ein oder mehrere Befehle oder Ausdrücke, die in geschweifte Klammern eingeschlossen sind (also praktisch Skriptblöcke). Syntaktisch verhält sich ein Anweisungsblock wie eine Einheit. Abfragen, Tests und Konditionen werden hingegen in runde Klammern eingeschlossen. Sie können auch über mehrere Zeilen verteilt sein.
Im Folgenden werden die wichtigsten Sprachelemente und Anweisungen beschrieben. Ausgangspunkt wird immer eine Kurzbeschreibung und die Syntax des jeweiligen Elements sein, gefolgt von Beispielen.
4.4.1 If/ElseIf/Else Anweisung
Die IF-Anweisung bietet eine Möglichkeit, Entscheidungen zu treffen und innerhalb eines Skriptes oder einer Funktion zu verzweigen. Die Syntax stellt sich wie folgt dar:
IF (<Pipeline1>) |
IF Schlüsselwort Pipeline1 zum Testen |
{ <StatementList> |
Anweisungsblock1 |
} ElseIF (<Pipeline2>) |
ElseIF Schlüsselwort Pipeline2 zum Testen bei ElseIF |
{ <StatementList> |
Anweisungsblock2 |
} Else { |
Else Schlüsselwort |
<StatementList> } |
Anweisungsblock3 |
Die zu testenden Ausdrücke (hier durch <Pipeline> angedeutet) können auch einfache Ausdrücke sein. Sie müssen lediglich den Wert $False oder $True zurückliefern. Die Schlüsselworte „ElseIF“ und „Else“ sind optional. Die gesamte Anweisung kann auch in einer einzigen Zeile geschrieben werden, mit oder ohne Leerzeichen zwischen den einzelnen Elementen. Wenn die IF-Anweisung in der Shell interaktiv verwendet und auf mehrere Zeilen verteilt wird, müssen die Schlüsselworte „ElseIF“ und „Else“ in der gleichen Zeile stehen wie die schließende Klammer des vorangegangenen Anweisungsblocks. Die IF-Anweisung hat folgenden Ablauf:
- Wenn Test der Pipeline1 den Wert $True ergibt, wird Anweisungsblock1 ausgeführt und die IF-Anweisung wird verlassen.
- Wenn Test der Pipeline1 den Wert $False ergibt, wird die Pipeline2 getestet.
- Ergibt der Test der Pipeline2 den Wert $True, wird der Anweisungsblock2 ausgeführt und die IF-Anweisung wird verlassen
- Ergibt der Test der Pipeline2 den Wert $False, wird der Anweisungsblock3 ausgeführt und die IF-Anweisung wird verlassen.
Es ist erlaubt, mehrere ElseIf Abschnitte zu verwenden.
Es sollte bei der Verwendung von ElseIf immer zum Schluss noch der Else-Zweig verwendet werden, da ansonsten nicht alle möglichen Eventualitäten abgefangen werden können, was häufig zu Fehlern führen kann, welche nicht einfach zu finden sind.
Beispiele:
1
2
3
4
5
6
7
8
9
10
|
1. IF (Get-ChildItem HKU: -ErrorAction SilentlyContinue){ "exists" }Else{ "not exists" } not exists 2. IF (Get-ChildItem HKLM: -ErrorAction SilentlyContinue){ "exists" }Else{ "not exists" } exists 3. IF ([DateTime]::Now -gt [DateTime] "01/25/2011" ){ "later" }Else{ "not later" } later 4. IF ([DateTime]::Now -gt [DateTime] "01/28/2011" ){ "later" }Else{ "not later" } not later 5. IF ((Get-ChildItem).Count –gt 100){“There are more than 100 files in this di-rectory”} There are more than 100 files in this directory |
Eine Übersicht aller Artikel dieser Windows PowerShell Blogserie findet ihr hier.
Zurück zu Part 16 – Rückgabewerte von Funktionen, Kommentare und Hilfe