PowerShell搜索时同时列出匹配与未匹配字符串的脚本修改方法
PowerShell脚本修改方案
原脚本仅会输出Select-String命中的搜索结果,未命中的关键词不会进入结果流,修改核心逻辑是先收集全量命中结果,再对比关键词全量列表补全未命中项,同时统一输出格式。
修改后完整代码
# 读取所有待搜索的关键词 $searchWords = Get-Content "C:\Directory containing file\Text_To_Search_For.txt" # 递归遍历根目录下所有文件,执行关键词匹配,结果存入变量 $matchResults = Get-Childitem -Path "C:\Start my search here\" -Recurse -File | Select-String -Pattern $searchWords | Select Filename, Line, @{n='SearchWord';e={$_.Pattern}}, LineNumber # 提取所有已经命中过的去重关键词,对比得到完全未匹配的关键词 $matchedWords = $matchResults.SearchWord | Select-Object -Unique $unmatchedWords = Compare-Object -ReferenceObject $searchWords -DifferenceObject $matchedWords | Where-Object SideIndicator -eq '<=' | Select-Object -ExpandProperty InputObject # 为未匹配关键词构造和命中结果同结构的条目 $unmatchResults = $unmatchedWords | ForEach-Object { [PSCustomObject]@{ Filename = '未匹配到任何文件' Line = '无匹配行内容' SearchWord = $_ LineNumber = '无匹配行号' } } # 合并两类结果输出,可直接导出为CSV留存 $finalReport = $matchResults + $unmatchResults $finalReport # 如需导出CSV报告,取消注释下面行即可 # $finalReport | Export-Csv -Path "C:\搜索结果报告.csv" -NoTypeInformation -Encoding UTF8
关键改动说明
- 给
Get-ChildItem增加-File参数,跳过目录对象,避免Select-String处理目录时抛出错误 - 将命中结果存入变量暂存,避免重复遍历文件浪费性能
- 通过对比全量关键词和已命中关键词的差集,得到所有未匹配的搜索词
- 未匹配项的字段结构和命中项完全对齐,后续导出、筛选不需要额外做格式适配
- 可选加导出CSV的逻辑,直接生成可打开的结构化报告
内容的提问来源于stack exchange,提问作者user3166462
相关产品推荐
相关产品推荐

