如何在PowerShell中用findstr查找同时含两个字符串的文件?
查找同时包含两个字符串的.txt文件的正确方法
为什么你之前的命令失效:
findstr /c:"String: A" /c:"String: B" *.txt采用OR逻辑,只要文件包含其中任意一个字符串就会返回,不符合“同时包含”的要求。- 管道命令错误:你在第二个
findstr后加了*.txt,导致它重新扫描所有文件,而非处理管道传来的结果,正确写法应去掉这个参数。 - 正则命令
findstr /r /c:"String: A.*String: B" *.txt仅匹配A在B之前且同一行连续出现的情况,若两行分开或顺序相反则无效,且findstr不支持跨行正则匹配。
正确解决方法
方法1:修正findstr管道命令
利用管道实现AND逻辑,先筛选包含第一个字符串的文件,再在这些文件中筛选包含第二个字符串的,同时用/m参数只输出文件名:
findstr /m /c:"String: A" *.txt | findstr /m /c:"String: B"
方法2:PowerShell原生命令(推荐)
用PowerShell的Select-String更灵活地检查双条件,效率也更高:
Get-ChildItem -Filter *.txt | Where-Object { (Select-String -Path $_.FullName -Pattern "String: A" -Quiet) -and (Select-String -Path $_.FullName -Pattern "String: B" -Quiet) } | Select-Object -ExpandProperty Name
-Quiet参数让Select-String仅返回布尔值(是否找到匹配),避免输出冗余内容。-and确保两个字符串都存在于文件中。
方法3:处理跨行/任意顺序的情况
如果两个字符串可能不在同一行,可读取整个文件内容进行检查:
Get-ChildItem -Filter *.txt | Where-Object { $content = Get-Content $_.FullName -Raw $content -match "String: A" -and $content -match "String: B" } | Select-Object -ExpandProperty Name
-Raw参数将文件内容作为单个字符串读取,支持跨行匹配检查。
内容的提问来源于stack exchange,提问作者keitereth24
相关产品推荐
相关产品推荐

