该findstr命令检查第一个搜索表达式并在找到元字符时更改为正则表达式模式,否则更改为文字模式,除非您通过/L(literal) 或/R(regular expression) 显式预定义模式。
但是findstr这是一个讨厌的野兽,因为即使使用以下方法仍然存在一些问题/L:
- 使用多个文字搜索字符串可能会返回错误的结果,除非您指定
/I进行不区分大小写的搜索;但这无论如何都不是问题,因为您正在处理目录和文件名,Windows 无论如何都会不区分大小写地处理它们;
- 尽管在文字模式下,当前面有 a 时,仍然会发生像
., [, ], ^, $, \, *and这样的元字符的转义;你可以加倍来解决这个问题;?\\
所以下面的代码应该在大多数情况下都可以工作; 此处通过 启用延迟扩展,这是读取在同一命令行中写入和cmd /V读取的临时变量所必需的:FILE
forfiles /S /M "*.txt" /D -1 /C "cmd /C if @isdir==FALSE (set FILE=@path) & cmd /V /C echo(!FILE:\=\\!" > "exclude.txt"
forfiles /S /M "*.txt" /C "cmd /C if @isdir==FALSE echo @path" > "all.txt"
for /F "delims=" %%X in ('findstr /V /L /I /X /G:"exclude.txt" "all.txt"') do (
echo(%%X
)
我在此处插入if @isdir==FALSE以不匹配名称以.txt. 我还添加/X了以findstr仅匹配整行/路径。
请注意,文字findstr搜索字符串的长度限制为 511 个字节(加倍之后\),可以通过文件路径轻松访问。
但是,完全避免的不同方法又findstr如何呢?
这是我曾经提供的一篇文章,用于返回比相对日期更新的项目forfiles:FORFILES date -after- (date calc in cmd file)。