使用批处理文件,处理所有在文件名或扩展名中共享字符串的文件就足够简单了,例如:
FOR /R %F IN (*.EXE) DO @ECHO %F
但是,如果我想反转文件集的含义怎么办?比如,处理所有不以.EXE结尾的文件?
FOR /R %F IN (anything-but-exe) DO @ECHO %F
通过阅读
FOR /?
的输出,我找不到任何似乎是我正在寻找的东西
这应该是另一种选择:
FOR /R %F IN (*.*) DO @if /i not "%~xF"==".exe" ECHO %F
for /f "tokens=* delims=" %a in ('dir /s /b /a:-d^|findstr /i/e/v ".exe" ') do @echo %a
findstr.exe
答案存在潜在问题。它使用搜索模式.exe
,但没有规定这应该是文字搜索模式。 Findstr.exe
默认使用正则表达式模式,这意味着字符 .
成为通配符(对于任何字符)。这意味着它也可以忽略不需要的文件,虽然文件名以 jexe
、lexe
、_exe
等结尾的可能性不大,但健壮的代码不应假定它不可能。
这是应该如何使用
findstr.exe
完成。
作为文字搜索模式:
For /F "EOL=? Tokens=* Delims=" %G In ('Dir /A:-D /B /S 2^>NUL ^| %SystemRoot%\System32\findstr.exe /VLIE ".exe"') Do @Echo %G
或者作为正则表达式模式,(其中
\
转义通配符.
,$
匹配行尾):
For /F "EOL=? Tokens=* Delims=" %G In ('Dir /A:-D /B /S 2^>NUL ^| %SystemRoot%\System32\findstr.exe /VRIC:"\.exe$"') Do @Echo %G
我还使用了
2>NUL
,将任何潜在的文件定位失败重定向到 NUL 设备,而不是将错误消息传递给管道 findstr.exe
命令。