1. Vergleichsoperatoren
1.1 Die Operatoren -Match, -NotMatch, -CMatch, -IMatch
     Beispiel 1a: Der Matchoperator auf ein Skalar angewendet
     Beispiel 1b: Der Matchoperator auf ein Array angewendet
     Beispiel 2: Auf welchen Positionen im Array liegt ein Treffer
     Beispiel 3: Der NotMatch Operator
     Beispiel 4: Der NotMatch Operator zum Zahlenvergleich
1.2 Die Operatoren -Like und -NotLike
      Beispiel 1: Vergleich zwischen -Like und -Match
1.3 Die Operatoren -Contains und -NotContains
      Beispiel 1: Der -Contains Operator
1.4 Die Operatoren -eq und -ne
      Beispiel 1: Vergleich -eq zu -contains

2 WildcardPattern-Klasse

 

1 Vergleichsoperatoren

Technet: about_Comparison_Operators

Powershell bietet mehrere Vergleichsoperatoren an, die man zum Analysieren von Teststrings (=Skalare) oder Arrays, die aus Textelementen bestehen, verwenden kann.

  • Match / -NotMatch
  • Like / -NotLike
  • Contains / -NotContains
  • eq / -ne  (equal / notequal)

Die angebotene Vielfalt ist in diesem Fall meiner Meinung nach eher verwirrend, da diese Operatoren untereinander sehr ähneln, sich an bestimmten Stellen dann aber tückisch im Detail unterscheiden.

 

1.1 Die Operatoren -Match, -NotMatch, -CMatch, -IMatch

Der Match Operator prüft eine Zeichenfolge mit einem Pattern, das einen regulären Ausdruck beinhalten kann, auf Übereinstimmung.

Nebenformen des -Match Operators sind:
-IMatch (unterscheidet keine Groß- und Kleinschreibung - incasesensitiv, identisch zu -Match)
-CMatch (unterscheidet Groß- und Kleinschreibung - casesensitiv)
IMatch und CMatch funktionieren einwandfrei, werden aber nicht in der offiziellen Onlinehilfe about_Comparison_Operators in der Technet aufgeführt und sind damit auch nicht supportet. Daher sollte man nach meiner Meinung bei längerlebigen Skripten wenn möglich auf deren Einsatz verzichten.

Der -Match Operator kann sowohl auf skalare Strings, wie auch auf Arrays anwendet werden. Die Ergebnisse in beiden Fällen unterscheiden sich jedoch, was eine tückische Fehlerquelle sein kann.


Beispiel 1a: Der Matchoperator auf ein Skalar angewendet

"Karl" -Match "K[a-c]r"
#Ergebnis
 
True


Beispiel 1b: Der Matchoperator auf ein Array angewendet

Set-StrictMode -Version "2.0"
Clear-Host

$Names = @("Karl","kcrl","Kfrl")
$Hits = $Names -Match "K[a-c]r"

$Hits
""
"Anzahl Treffer: {0}" -f $Hits.Count
#Ergebnis
 
Karl
kcrl

Anzahl Treffer: 2

Auf ein Array angewandt, liefert -match also die Treffer selbst als Array zurück, bei einem Skalar das boolsche Ergebnis

Daher sollte man das Array "Names" auch immer als solches mit @() definieren, da bei nur einem einzigen Element Powershell $Names als Skalar ansieht.

Möchte man dagegen Arrays durchsuchen und nur die boolsche Information bekommen, ob ein Element enthalten ist oder nicht, so ist dafür der -Contains Operator die richtige Wahl (siehe weiter unten)


Beispiel 2: Auf welchen Positionen im Array liegt ein Treffer

Set-StrictMode -Version "2.0"
Clear-Host
 
$Names = @("Karl","karl","Fritz","Karl") #Arraydefinition

$HitIndexes = @()
$Position = -1 #Array beginnt normalerweise bei 0 zu Zählen

$Names | Foreach{
 $Position+=1
 if($_ -match "K[a-c]r"){
  $HitIndexes += $Position
  }
 }
 
 $HitIndexes
#Ausgabe

0
1
3

Man erhält ein Array $HitIndexes zurück, das die Indexes enthält, bei denen im Array $Names Treffer vorkommen.


Beispiel 3: Der -NotMatch Operator 

Set-StrictMode -Version "2.0"
Clear-Host
 
"Karl" -NotMatch "K[b-d]r"
"`n"
"Karl", "Hugo", "Heinz" -Notmatch "Karl"
#Ergebnis

True

Hugo
Heinz

Der -Notmatch liefert Treffer, wenn die Bedingung nicht zutrifft und damit die inversen Ergebnisse der Beispiele 1a und 1b.

-NotCMatch oder NotIMatch sind nicht im Sprachumfang enthalten und liefern Fehlermeldungen. Hier scheint die Powershell V2.0 noch nicht ganz konsistent zu sein.


Beispiel 4: Der -NotMatch Operator zum Zahlenvergleich

Set-StrictMode -Version "2.0"
Clear-Host
 
$Value=0
 While($Value -notmatch 3)
 {
     $Value++
     Write-Host $Value
 }
#Ergebnis

1
2
3

Mit -Match und -NotMatch können nicht nur Strings verglichen werden, sondern auch Integerzahlen. Überlicherweise werden hierfür jedoch die Operatoren -eq und -ne eingesetzt.

 

1.2 Die Operatoren -Like und -NotLike

-Like und -NotLike sind -Match und -NotMatch sehr ähnlich. Der Unterschied besteht darin, dass -Like / -NotLike die Wildcardoperator "*" oder "?" benötigen, wenn der Suchstring innerhalb eines anderen Strings enthalten ist.

 

Beispiel 1: Vergleich zwischen -Like und -Match

Set-StrictMode -Version "2.0"
Clear-Host

$Names = "abcKarlabc", "Hugo", "Heinz"
 
$Names -Like "*K[a-c]rl*"
$Names -Like "???K[a-c]rl???"
$Names -Match "K[a-c]rl"
#Ergebnis

abcKarlabc
abcKarlabc
abcKarlabc

Sowohl -Like und -Match können mit regulären Ausdrücken verwendet werden, was gelegentlich auf einigen Webseiten falsch dargestellt wird.


Ebenso verhalten sich beide Operatoren bei Skalaren und Arrays identisch.

 

1.3 Die Operatoren -Contains und -NotContains

Contains / NotContains prüfen auf exakte Übereinstimmung, kennen keine Wildcards, keine regulären Ausdrücke und geben immer einen boolschen Wert zurück.

 

Beispiel 1: Der -Contains Operator

Set-StrictMode -Version "2.0"
Clear-Host

"*Karl*", "Hugo", "Heinz" -Contains "*Karl*"  
"abcKarlabc", "Hugo", "Heinz" -Contains "*Karl*"
"K[a-c]rl" -Contains "K[a-c]rl"
#Ausgabe

True
False
True

Sowohl auf Skalare, wie auch auf Arrays angewendet, liefert -contains einen "True" oder "False" zurück.
Wildcards wie "*" und reguläre Ausdrücke wie "[a-c]" werden als normale Zeichenfolgen angesehen.

 

1.4 Die Operatoren -eq und -ne

Beim Vergleichen von Texten verhalten sich -eq und -ne sehr ähnlich zu den Operatoren -contains und -notcontains. 

 

Beispiel 1: Vergleich -eq zu -contains

Set-StrictMode -Version "2.0"
Clear-Host

"Karl", "Hugo", "Heinz" -Contains "Karl"
"abcKarlabc", "Hugo", "Heinz" -Contains "Karl"
"Karl" -Contains "Kalle"
"`n"
"Karl", "Hugo", "Heinz" -eq "Karl"
"abcKarlabc", "Hugo", "Heinz" -eq "Karl" #keine Ausgabe
"Karl" -eq "Kalle"
#Ausgabe

True
False
False

Karl
False

Beide Operatoren prüfen auf exakte Übereinstimmung. Die Verwendung von Wildcards oder regulären Ausdrücken ist nicht möglich. 
Wie man im Beispiel sieht, unterscheiden sich jedoch die zurückgegebenen Werte in einigen Fällen.

-eq und ne wird üblicherweise beim Vergleichen von Integerwerten eingesetzt.

 

MSDN: WildcardPattern Class

Vielleicht wollt ihr vor dem Vergleich zweier Strings mittels Operatoren herausfinden, ob der String nicht selbst Wildcards wie "*","?" und "[]" enthält. Das kann man sehr elegant mit dieser Klasse erledigen:

$Test ="bl*a"
[System.Management.Automation.WildcardPattern]::ContainsWildcardCharacters($Test)

#Ausgabe

 

True