如果字符串被放置在一个序列中而不是另一个序列中,为什么使用powershell 4.0在文本文件中搜索字符串会被忽略?

如果字符串被放置在一个序列中而不是另一个序列中,为什么使用powershell 4.0在文本文件中搜索字符串会被忽略?,powershell,select-string,Powershell,Select String,因为results.txt包含WORD_2、PHRASE2、WORD和短语的所有实例而有效的代码: $output_file = ‘results.txt’ $listtomatch = @("WORD_2", "PHRASE2","WORD", "PHRASE") select-string -Path filetosearchin.txt -Pattern $listtomatch -CaseSensitive | % { $_.Matches } | % { $_.Value }

因为results.txt包含WORD_2、PHRASE2、WORD和短语的所有实例而有效的代码:

$output_file = ‘results.txt’
$listtomatch = @("WORD_2", "PHRASE2","WORD",  "PHRASE") 
select-string -Path filetosearchin.txt -Pattern $listtomatch -CaseSensitive | % { $_.Matches } | % { $_.Value } 
无法工作的代码,因为它只返回单词和短语的所有实例,但不返回单词_2或短语2:

$output_file = ‘results.txt’
$listtomatch = @("WORD", "PHRASE","WORD_2",  "PHRASE2") 
select-string -Path filetosearchin.txt -Pattern $listtomatch -CaseSensitive | % { $_.Matches } | % { $_.Value }
字符串的顺序是否与输入select字符串的方式相冲突,从而产生不同的结果

我希望上面的两个代码都能给出相同的结果:所有字符串的所有实例:WORD_2、PHRASE2、WORD和短语

让PowerShell创建并包括
-AllMatches
参数:

## Q:\Test\2019\07\31\SO_57297393.ps1
$listtomatch = @("WORD_2","PHRASE2","WORD","PHRASE") 

Select-String -Path filetosearchin.txt -Pattern ($listtomatch -join '|') -CaseSensitive -AllMatches| 
   % { $_.Matches } | % { $_.Value }
使用输入文件:

> Get-Content .\filetosearchin.txt
1:"WORD_2","PHRASE2","WORD","PHRASE"
2:"PHRASE2","WORD","PHRASE","WORD_2"
3:"WORD","PHRASE","WORD_2","PHRASE2"
4:"PHRASE","WORD_2","PHRASE2","WORD"
脚本将生成:

> .\SO_57297393.ps1
WORD_2
PHRASE2
WORD
PHRASE
PHRASE2
WORD
PHRASE
WORD_2
WORD
PHRASE
WORD_2
PHRASE2
PHRASE
WORD_2
PHRASE2
WORD

因为它正在执行一个正则表达式匹配,这并不是为这样的数组设计的。尝试将阵列与管道连接起来,这应该适合您
$listtomatch='WORD|u2 | PHRASE2 | WORD | PHRASE2 | PHRASE'
或者因为它是regex,更简单的
$listtomatch='WORD(?:| u2)| PHRASE2?
因为它是模式匹配。模式数组中的顺序很重要。如果数组的第一个元素匹配,则数组的其余元素在该行上将不匹配。在第二批代码中,如果一行与单词匹配,短语将永远不会与该行匹配。由于WORD始终与WORD_2匹配,但反之亦然,因此在两个代码示例之间也会得到不同的结果。