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
也不会改变这一点 - 它只会报告每行的多个匹配项 对于第一个模式 .
我在解决对以下脚本的修订时遇到问题。 该脚本将接收一些关键字,这些关键字可以是手动添加的,也可以是从文件中读取的。 当它通过列出文件名、行号和搜索词找到匹配项时,它将输出数据。不幸的是,如果我正在搜索多个单词,它必须扫描文件以查找每个单独的单词。这意味着如果我有 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
也不会改变这一点 - 它只会报告每行的多个匹配项 对于第一个模式 .