it-swarm.com.de

PowerShell und der Operator -contains

Betrachten Sie das folgende Snippet:

"12-18" -Contains "-"

Sie denken, dies ergibt true, aber das ist nicht der Fall. Dies wird stattdessen zu false ausgewertet. Ich bin nicht sicher, warum das passiert, aber es passiert.

Um dies zu vermeiden, können Sie stattdessen Folgendes verwenden:

"12-18".Contains("-")

Jetzt wird der Ausdruck als wahr ausgewertet.

Warum verhält sich das erste Code-Snippet so? Gibt es etwas Besonderes an - das passt nicht zu -Contains? Die Dokumentation erwähnt nichts darüber.

106
tnw

Der Operator -Contains führt keine Teilzeichenfolgenvergleiche durch. Die Übereinstimmung muss in einer vollständigen Zeichenfolge vorliegen und wird zum Durchsuchen von Sammlungen verwendet.

Aus der Dokumentation, mit der Sie verknüpft haben:

-Contains Beschreibung: Containment-Operator. Gibt an, ob eine Sammlung von Referenzwerten einen einzelnen Testwert enthält.

In dem von Ihnen angegebenen Beispiel arbeiten Sie mit einer Sammlung, die nur ein Zeichenfolgenelement enthält.

Wenn Sie die von Ihnen verlinkte Dokumentation lesen, sehen Sie ein Beispiel, das dieses Verhalten demonstriert:

Beispiele:

PS C:\> "abc", "def" -Contains "def"
True

PS C:\> "Windows", "PowerShell" -Contains "Shell"
False  #Not an exact match

Ich denke, was Sie wollen, ist der -Match Operator:

"12-18" -Match "-"

Das gibt True zurück.

Wichtig: Wie in den Kommentaren und in der verlinkten Dokumentation erwähnt, sollte beachtet werden, dass der -Match Der Operator verwendet reguläre Ausdrücke , um den Textabgleich durchzuführen.

149
Kev

-Contains ist eigentlich ein Erfassungsoperator. Es ist wahr, wenn die Auflistung das Objekt enthält. Es ist nicht auf Saiten beschränkt.

-match und -imatch sind String-Matcher für reguläre Ausdrücke und legen automatische Variablen für Captures fest.

-like, -ilike sind SQL-ähnliche Matcher.

35
Eris

Sie können like verwenden:

"12-18" -like "*-*"

Oder split für contains:

"12-18" -split "" -contains "-"
8
Esperento57
  • like ist am besten oder am einfachsten.
  • match wird für Regex-Vergleiche verwendet.

Referenz: https://docs.Microsoft.com/en-us/powershell/module/Microsoft.powershell.core/about/about_comparison_operators?view=powershell-6

0
Maximojo