2016-06-29 9 views
-2

benutzte ich die folgenden Schritte, um eine Zeichenfolge aus der Datei in allen LinienAbrufen zweiten Teil einer Linie, wenn der erste Teil entspricht genau

$variable = '[email protected]' 
$test = $variable.split('@')[0]; 
$file = Get-Content C:\Temp\file1.txt | Where-Object { $_.Contains($test) } 
$postPipePortion = $file | Foreach-Object {$_.Substring($_.IndexOf("|") + 1)} 

Dies führt abzurufen, die $test als Teil enthalten. Ich möchte nur, dass das Ergebnis nur die Zeilen enthält, die exakt mit $test übereinstimmen.

Zum Beispiel, wenn eine Datei enthält

abc_def|hf#23$ 
abc|ohgvtre 

Ich will nur den Text ohgvtre

+0

Ich folge dir nicht. Warum sollten Sie die Saite überhaupt aufteilen? Warum nicht einfach nach 'abc @ yahoo.com' suchen? –

+1

@briantist Kein Duplikat. [Diese Frage] (http://stackoverflow.com/questions/18877580/powershell-and-the-contains-operator) geht es um den Operator, der nicht an Zeichen in Strings arbeitet. Dieser benutzt korrekt die .NET 'String.Contains' Methode um Teilstrings zu vergleichen. Das Problem besteht darin, dass OP eine exakte Übereinstimmung und keine Teilstring-Übereinstimmung wünscht, daher sind beide Formen von "contains" falsch. –

+0

@RyanBemrose du hast recht; Ich habe meine enge Abstimmung zurückgezogen. – briantist

Antwort

1

Wenn ich die Frage richtig verstehen wollen Sie wahrscheinlich Import-Csv verwenden, anstatt Get-Content:

Import-Csv 'C:\Temp\file1.txt' -Delimiter '|' -Header 'foo', 'bar' | 
    Where-Object { $_.foo -eq $test } | 
    Select-Object -Expand bar 
1

Um die genaue Übereinstimmung zu adressieren, sollten Sie auf Gleichheit (-eq) anstatt substri prüfen ng (.Contains()). Außerdem müssen die Daten nicht mehrfach analysiert werden. Hier ist Ihr Code, neu geschrieben, um in einem Durchlauf über die Daten mit dem -split Operator zu arbeiten.

$variable = '[email protected]' 
$test = $variable.split('@')[0]; 

$postPipePortion = (

    # Iterate once over the lines in file1.txt 
    Get-Content C:\Temp\file1.txt | foreach { 

    # Split the string, keeping both parts in separate variables. 
    # Note the backslash - the argument to the -split operator is a regex 
    $first, $second = ($_ -split '\|') 

    # When the first half matches, output the second half. 
    if ($first -eq $test) { 
     $second 
    } 
    } 
) 
Verwandte Themen