2016-03-29 11 views
3

Lesen official docs es ist offensichtlich, dass PowerShell -match Operator ist leistungsfähiger als -like (aufgrund der regulären Ausdrücke). Zweitens scheint es ~ 10 mal schneller nach diesem Artikel https://www.pluralsight.com/blog/software-development/powershell-operators-like-match.PowerShell -match vs-like

Gibt es spezielle Fälle, in denen ich -like statt -match bevorzugen sollte? Wenn nicht, warum sollte ich überhaupt -like verwenden? Existiert es aus historischen Gründen?

Antwort

4

Sehen Sie diese Erklärung von Differences Between -Like and -Match

Auf den Punkt gebracht, wenn Sie denken, ‚ich wahrscheinlich eine Wildcard benötigen werde diesen Artikel zu finden‘, dann mit -Like starten. Wenn Sie sich jedoch der meisten Buchstaben in dem von Ihnen gesuchten Wort sicher sind, sollten Sie besser mit -Match experimentieren.

Hier ist eine technische Unterscheidung: -Match ist ein regulärer Ausdruck, während -Like ist nur ein Platzhalter-Vergleich, eine Teilmenge von -Match.

Also, wenn Sie nicht sicher sind, welche Charakterklassen, dh Ziffern, Buchstaben, Satzzeichen, etc., kann es innen sein, wenn Sie jedes Zeichen nur passen wollen, sollten Sie mit -Like sein mit seinem Platzhalter.

Wenn Sie wissen, dass am Anfang eine Ziffer gefolgt von 1 + Folgen eines Doppelpunkts folgen muss, gefolgt von alphanumerischen Zeichen bis zum Ende der Zeichenfolge, verwenden Sie -Match mit seiner leistungsfähigen regular expressions.

+0

Heh, sagt, dass Artikel Platzhalter eine Teilmenge von regexs sind.Versuchen Sie, das Muster '*' durch einen Regex zu setzen und zu sehen, was passiert :) –

+0

Sie sagen mir, dass ich einen Quantifizierer allein in einem Regex-Muster verwenden soll? Ich weiß, was passieren wird, ohne das im Online-Tester zu überprüfen. –

+0

Nein, das habe ich nicht so gemeint, tut mir leid. Ich habe den Artikel nur kommentiert: Er sagt, dass Wildcards eine Teilmenge von Regexes sind, wenn sie es offensichtlich nicht sind. Sie sind weniger mächtig als Regexes, aber sie sind keine Untermenge. –

1

Sie sollten -like bevorzugen, wenn Ihre Vergleichszeichenfolge ein Wildcard-Dateiname im DOS-Stil ist. Wenn Sie ein Cmdlet haben, das wie eine "Standard" Windows-Befehlszeilenanwendung aussieht, können Sie erwarten, dass Dateinamen-Parameter Platzhalter im DOS-Stil enthalten.

Möglicherweise haben Sie ein grep-ähnliches Cmdlet, das eine Regex und eine Liste von Dateien verwendet. Ich kann mir vorstellen, es wie folgt verwendet:

> yourMagicGrepper "^Pa(tt).*rn" *.txt file.* 

Sie würden -match verwenden, wenn mit dem ersten Parameter zu arbeiten, und -like für alle anderen Parameter.

Mit anderen Worten: Es hängt von Ihren funktionalen Anforderungen ab.

3

Ich habe nie gesehen -match Test viel schneller als -like, wenn überhaupt. Normalerweise sehe ich -like mit ungefähr der gleichen oder besseren Geschwindigkeit.

Aber ich verlasse mich nie auf eine Test-Instanz, ich laufe normalerweise etwa 10K Wiederholungen von jedem.

ob Du für Leistung suchen, immer String-Methoden bevorzugen, wenn sie die Anforderungen erfüllen werden:

$string = '123abc'  

(measure-command { 
for ($i=0;$i -lt 1e5;$i++) 
{$string.contains('3ab')} 
}).totalmilliseconds 

(measure-command { 
for ($i=0;$i -lt 1e5;$i++) 
{$string -like '*3ab*'} 
}).totalmilliseconds 

(measure-command { 
for ($i=0;$i -lt 1e5;$i++) 
{$string -match '3ab'} 
}).totalmilliseconds 

265.3494 
586.424 
646.4878 
+0

In der Tat ist '-like' hier schneller als' -match' (meine Ergebnisse 149.6149, 215.0783, 284.6945) – Bad