查找包含字符串 x 并排除字符串 y 的文件

Finding files that contain string x and excludes string y

我有一个文件目录,里面有许多 .pdf 个文件。
我想计算目录中有多少文件包含单词 SSN,不包括其中还包含单词 testversion *.1 的文件。
现在我有以下代码来检查哪些文件中有单词 SSN

findstr /S /I /M ssn *.pdf  

因此需要显示包含单词 SSN 和短语 testversion 1.2 的文件。
不需要显示包含单词 SSN 和短语 testversion 1.1 的文件。

我想我需要用 /R 正则表达式命令做点什么,但我还没有掌握正则表达式。

@echo off
setlocal

set "count=0"

for /f "delims=" %%A in ('findstr /i /m /s /r /c:"\<testversion [0-9][0-9]*\.[02-9]" "*.pdf"') do (
    for /f "delims=" %%B in ('findstr /i /r /m /c:"\<ssn\>" "%%~A"') do set /a "count+=1"
)

echo %count%

首先检查 testversion digits.digit,其中最后一位不是 1,因为那是条件值,然后检查 ssnfor 都循环 return 文件名,因此您可以在定义的地方使用 echo %%Aecho %%B 检查文件名。

在正则表达式中:* 是前一个字符或集合,0 次或多次。使用 dir 命令等。 * 是通配符。只是要注意区别。

由于 pdf 文件是二进制文件(+ 一些文本)而不是所有文本,因此无法保证字边界 \<\> 是否有效好等等。模式可能需要根据需要进行调整。纯文本文件肯定会更好,因为正则表达式不是为二进制设计的。

这可能只是为了计数更快:

@echo off
setlocal

set "count=0"

for /f "delims=" %%A in ('findstr /i /m /s /r /c:"\<testversion [0-9][0-9]*\.[02-9]" "*.pdf"') do (
    findstr /i /r /m /c:"\<ssn\>" "%%~A" >nul && set /a "count+=1"
)

echo %count%

这消除了第二个 for 循环。