| | 0

PowerShell: Operatoren und Ausdrücke (Vergleichsoperatoren, Mustervergleichsoperatoren) – Part 9

NEW: sepagoTraining – Grundlagenkurs: How to Windows PowerShell

3.9.3 Vergleichsoperatoren

Die Vergleichsoperatoren beginnen immer mit einem Bindestrich. Sie werden in Ausdrucken verwendet, welche logische Überprüfungen darstellen. Diese liefern immer entweder $False oder $True zurück. In der folgenden Tabelle sind die Vergleichsoperatoren der PowerShell zusammen gefasst.

Operator Beschreibung Beispiel Resultat
-eq Ist gleich (equal) 5 –eq 5 $True
-ne  Ist nicht gleich (not equal) 5 –ne 5 $False
-gt Größer als (greather than) 5 –gt 3 $True
-ge Größer als oder gleich (greather than or equal) 5 –ge 3 $True
-lt Kleiner als (less than) 5 –lt 3 $False
-le Kleiner als oder gleich (less than or equal) 5 –le 3 $False
-contains Beinhaltet 1,2,3 –contains 2 $True
-notcontains Beinhaltet nicht 1,2,3 –notcontains 2 $False

Tabelle 3 6: Vergleichsoperatoren

 

Jedem der Vergleichsoperatoren kann ein „c“ oder ein „i“ vorangestellt werden (z.B. –ieq, -ccontains). Damit wird explizit definiert, ob der Vergleich (bei Strings) mit oder ohne Beachtung der Groß-/Kleinschreibung erfolgen soll. Dabei bedeutet „c“ case sensitiv (also mit Beachtung der Groß-/Kleinschreibung und „i“ case insensitiv, d.h. ohne Beachtung der Groß-/Kleinschreibung. Somit ergeben sich insgesamt 24 Vergleichsoperatoren.

Die Vergleichsoperatoren können auch auf sog. Collections (Sammlungen) angewendet werden. Collection ist ein recht weiter Begriff und schließt Arrays, Hashtables und diverse andere mit ein. Das einfachste Verhalten illustrieren folgende Beispiele:

1
2
3
4
5
6
7
8
9
10
11
12
1.  1,2,3,4,5,2,6 –eq 2
2
2
2.  1,2,3,4,5,2,6 –contains 2
True
3.   „eins“,“zwei“,“drei“ –eq „zwei“
zwei
4.  1,"02",3,02,"1" -eq "2"
2
5.  1,"02",3,02,"1" -eq "2"
2
2

3.9.4  Mustervergleichsoperatoren (Pattern Matching)

Die Mustervergleichsoperatoren arbeiten mit Operanden vom Typ String. Es wird zwischen zwei Typen von Mustern unterschieden, den Wildcards und den regulären Ausdrücken. Als Wildcards gelten wie sonst üblich „*“ (beliebige Anzahl beliebiger Zeichen) und „?“ (ein beliebiges Zeichen). Reguläre Ausdrücke*  sind wesentlich komplexer und leistungsfähiger. Die Wildcards können als eine Untermenge von regulären Ausdrücken betrachtet werden, dabei ist die Syntax unterschiedlich („*“ entspricht „.*“ und „?“ entspricht „.“). Folgende Tabelle beschreibt die Mustervergleichsoperatoren der PowerShell.

Operator Beschreibung Beispiel Resultat
-like Mustervergleich anhand Wildcards „eins“ –like „e*“ $True
-notlike Mustervergleich anhand Wildcards, Wahr wenn keine Übereinstimmung „eins“ –notlike „e*“ $False
-match Mustervergleich anhand Regulärer Ausdrücke „hallo“ –match „[jkl]“ $True
-notmatch Mustervergleich anhand Regulärer Ausdrücke, Wahr wenn keine Übereinstimmung „hallo“ –nomatch„[jkl]“ $False
-replace Ersetzung anhand von Regulären Ausdrücken „hallo“ –replace „allo“,“i“ „hi“
Löschen von Stringteilen anhand Regulärer Ausdrücke „abcdef“ –replace „def“ „abc“

Tabelle 3 7: Mustervergleichsoperatoren (Pattern Matching)

 

Wie bei den Vergleichsoperatoren, kann auch bei den Mustervergleichsoperatoren hinter dem „-„ Zeichen der Buchstabe „i“ oder „c“ für einen Groß-/Kleinschreibung erzwungenen Vergleich verwendet werden.

Die PowerShell kennt noch zwei weitere Formen von Wildcards: „Aufzählung“ und „Bereich“. Hierzu ein Beispiel:

1
2
3
4
5
6
7
8
9
10
1.  a[bc]c –match abc
True
2.  a[bc]c –match acc
True
3.  a[b-d]c –match abc
True
4.  a[b-d]c –match acc
True
5.  a[b-d]c –match adc
True

 

Eine Aufzählung wird in eckigen Klammern aufgeführt und beinhaltet eine Folge von Zeichen. Ein Bereich wird ebenfalls in eckigen Klammern aufgeführt und beinhaltet das Start- und das Endzeichen der Aufzählung getrennt mit einem Bindestrich. Im obigen Beispiel wird in den Zeilen eins und zwei eine Aufzählung von zwei Zeichen verwendet. Die übrigen Zeilen verwenden einen Bereich von „b“ bis „d“. Das Ganze funktioniert natürlich nur mit Zeichenfolgen, welche eine natürliche Ordnung besitzen ([a-z], [A-Z], [1-9] aber nicht mit [&-$]).

Der Operator „-like“ arbeitet mit Wildcards, hingegen die Operatoren „-match“ und „-replace“ mit regulären Ausdrücken. Im letzten Fall wird im Hintergrund immer die Variable „$matches“ verwendet, um die „Treffer“ zu speichern. Folgendes Beispiel illustriert das:

1
2
3
4
5
6
7
8
9
10
11
1.  "123" -match "(1)((2)(3))"
True
2.  $Matches
Name                           Value
----                           -----
4                              3
3                              2
2                              23
1                              1
0                              123

 

Die Klammern auf der rechten Seite des Vergleiches definieren die einzelnen Treffer (Submatches). Sie können im Allgemeinen auch zum Ersetzen in regulären Ausdrücken verwendet werden. Alle Submatches werden in der Variablen $Matches als eine Hashtable gespeichert. Somit kann auch diese Variable zum Verarbeiten der Treffer verwendet werden. In dieser Hashtable werden die Schlüssel (Keys, Spalte „Name“) als fortlaufende natürliche Zahlen generiert. Die .Net Klassen, welche für die regulären Ausdrücke in der PowerShell verwendet werden, erlauben die Benennung der einzelnen Treffer. Innerhalb der runden Klammern sind dann Ausdrücke der Form „?<Treffername>“ zu platzieren. Das obige Beispiel kann dann wie folgt aussehen:

1
2
3
4
5
6
7
8
9
10
11
1.  "123" -match "(?<m1>1)(?<m2>(?<m3>2)(?<m4>3))"
True
2.  $Matches
Name                           Value
----                           -----
m4                             3
m1                             1
m3                             2
m2                             23
0                              123

 

Die Spalte „Name“ enthält nun mal die angegebenen Namen. Das Ansprechen der einzelnen Treffer ist dann viel sprechender, was die Lesbarkeit von Skripten erheblich erhöhen dürfte. Um das Match Nummer zwei anzusprechen, kann der Ausdruck $matches.m2 verwendet werden. Der Rückgabewert in dem Beispiel wäre „23“.

*Die regulären Ausdrücke werden immer wieder und immer häufiger in diesem PowerShell Lehrgang anzutreffen sein. Sie selbst sind jedoch nicht Gegenstand dieser Abhandlung. Viel mehr wird auf andere Quellen verwiesen, sei es die sepago Freitagsveranstaltung zu diesem Thema. Darüber hinaus gibt es unzählige Webseiten, welche sich mit regulären Ausdrücken beschäftigen. Aus meiner Sicht ist http://www.regular-expressions.info/ besonders empfehlenswert.