我使用以下步骤从文件中检索字符串
$variable = 'abc@yahoo.com'
$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 :(得分: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 :(得分:1)
要解决完全匹配问题,您应该测试相等性(-eq
)而不是子字符串(.Contains()
)。此外,无需多次解析数据。以下是您的代码,重写为使用-split
运算符对数据进行一次操作。
$variable = 'abc@yahoo.com'
$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
}
}
)