Powershell - 扫描多个文件中的多个字符串

Powershell - Scan for multiple strings in multiple files

我在解决对以下脚本的修订时遇到问题。 该脚本将接收一些关键字,这些关键字可以是手动添加的,也可以是从文件中读取的。 当它通过列出文件名、行号和搜索词找到匹配项时,它将输出数据。不幸的是,如果我正在搜索多个单词,它必须扫描文件以查找每个单独的单词。这意味着如果我有 20 个搜索词,它将打开、扫描、关闭每个文件 20 次。每个单词一次。 不好,因为这需要时间,而且我仍然需要通过输出来计算每个文件的总匹配数。 我所做的每一个更改都是灾难性的,因为它会打印每个搜索词而不知道哪个词是匹配的,或者更糟的是它无法匹配 运行。 谁能帮我修改脚本,对所有搜索词扫描一次文件,并以可读的方式仅列出匹配项,如下面的输出?

此致, -罗恩

$searchWords="Address", "City","State"
Foreach ($sw in $searchWords)
{
    Get-Childitem -Path "C:\Workspace\src" -Recurse -include "*.cbl" | 
    Select-String -Pattern "$sw" | 
    Select Path,LineNumber,@{n='SearchWord';e={$sw}}

}

-Pattern 接受 数组 模式,并且可以通过 .Pattern 属性 访问哪些模式导致给定匹配Select-String 的输出对象:[1]

Get-Childitem -Path "C:\Workspace\src" -Recurse -include "*.cbl" | 
  Select-String -Pattern "Address", "City", "State" | 
    Select Path, LineNumber, @{n='SearchWord';e={$_.Pattern}}

注意:为简洁起见,我在这里将搜索词作为文字数组传递;在您的代码中,只需将 "Address", "City", "State" 替换为 $searchWords 没有 "..." 中的 附件)。


顺便说一句:使用 -Filter 而不是 -Include 可以加快您的命令速度,并且鉴于您的命令参数不包含空格或其他元字符, 引用 它们是可选的:

Get-Childitem -Path C:\Workspace\src -Recurse -Filter *.cbl | 
  Select-String -Pattern Address, City, State | 
    Select Path, LineNumber, @{n='SearchWord';e={$_.Pattern}}

[1] 注意:只有 first 在指定的模式中匹配,在指定的顺序中,在给定的行上匹配被报告为该行的匹配模式 - 即使其他人也会匹配。即使 -AllMatches 也不会改变这一点 - 它只会报告每行的多个匹配项 对于第一个模式 .