2016-06-29 89 views
-2

我用下面的步驟從文件檢索線的第二部分的第一部分相匹配時恰好

$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)} 

這導致包含$test作爲一個子字符串的所有行檢索的字符串。我只想讓結果僅包含與$test完全匹配的行。

例如,如果一個文件包含

abc_def|hf#23$ 
abc|ohgvtre 

我只想文字ohgvtre

+0

我不關注你。爲什麼麻煩分裂字符串呢?爲什麼不直接搜索'abc @ yahoo.com'? –

+1

@briantist不重複。 [那個問題](http://stackoverflow.com/questions/18877580/powershell-and-the-contains-operator)是關於運算符,它不適用於字符串中的字符。這一個正確使用.NET的'String.Contains'方法來比較子字符串。問題是,OP想要一個精確的匹配,而不是一個子字符串匹配,所以兩種形式的「包含」都是錯誤的。 –

+0

@RyanBemrose你是對的;我收回了我的近距離投票。 – briantist

回答

1

如果我理解正確的問題,你可能想使用Import-Csv而不是Get-Content

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

要解決確切的匹配問題,您應該測試平等(-eq)而不是substri ng(.Contains())。而且,不需要多次解析數據。這裏是您的代碼,重寫爲使用-split運算符在數據上進行一次操作。

$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 
    } 
    } 
) 
相關問題