4

我想递归删除批处理文件中具有特定扩展名的所有文件。

我知道以下命令:

del /s *.ext

但是,这在 Windows 上也会删除具有其他扩展名的文件,例如 .ext1 或 .ext2 。其原因似乎是此类文件的 8.3 文件名以 .ext 结尾,因此扩展名较长的文件也匹配。

我正在寻找上述命令的替代品,它递归地删除所有具有 .ext 扩展名的文件,但保留具有更长扩展名的文件。

4

3 回答 3

2

where命令的工作方式略有不同(关于通配符和短名称)。放一个for /f循环,你就完成了。然后,您的示例将转换为:

for /f "delims=" %%a in ('where /r . *.ext') do ECHO del "%%a"

注意:我只是通过回显命令来解除del命令。ECHO当您确定它完全符合您的要求时,请删除故障排除后。

于 2020-07-23T07:38:55.880 回答
2

这也使用where.exe,但考虑到另一个答案中未提及的问题。

问题是where搜索会将列出的每个扩展附加%PATHEXT%到您的.extglob/spec。因此,虽然它会删除您的目标文件,但不包括诸如.ext1等之类的文件.ext2。它现在将包括例如, *.ext.com, *.ext.exe, *.ext.bat, *.ext.cmd, *.ext.vbs, *.ext.vbe, *.ext.js, *.ext.jse,*.ext.wsf等。*.ext.wsh*.ext.msc

解决方法是%PATHEXT%在发出命令之前简单地清空 的内容。以下方法在带括号的For循环命令中执行此操作。由于它是在另一个cmd.exe实例中运行的,因此它不会影响脚本其余部分所在的实例:

@For /F "Delims=" %%G In ('"(Set PATHEXT=) & "%__APPDIR__%where.exe" /F /R "C:\SourceDir" "*.ext" 2>NUL"') Do @Del /A /F %%G

显然,您将修改,C:\SourceDir以包含您需要的根位置。其他当前答案,使用当前目录。如果需要,请将其更改为.,或者如果您希望目录库作为批处理文件的目录,请将其更改为%~dp0.. 请不要删除任何双引号。


以下是一些替代方法示例,(请记住根据需要调整驱动器/路径/扩展名)

如果您希望坚持使用更传统的Dir命令,那么您可以通过该findstr.exe实用程序管道结果,以排除与 8.3 名称匹配的那些:

@For /F "Delims=" %%G In ('"Dir /B /S /A:-D "C:\SourceDir\*.ext" 2> NUL | "%__APPDIR__%findstr.exe" /I /L /E ".ext""') Do @Del /A /F "%%G"

您还可以将该forfiles.exe实用程序用于该任务:

@"%__APPDIR__%forfiles.exe" /P "C:\SourceDir" /S /M "*.ext" /C "\"%__APPDIR__%cmd.exe\" /C \"If @IsDir==FALSE Del /A /F @File\""

或者这种极其缓慢的WMIC.exe实用方法:

@"%__APPDIR__%wbem\WMIC.exe" DataFile Where "Drive='C:' And Path Like '\\SourceDir\\%%' And Extension='ext'" Delete 1> NUL 2>&1
于 2020-07-23T12:21:07.737 回答
1

Stephans答案是较短的版本,但您也可以使用findstr's 正则表达式来匹配名称的结尾应该是.ext

for /f "delims=" %%i in ('dir /b /s ^| findstr /IRC:"\.ext$"') do echo del "%%~i"
于 2020-07-23T08:50:06.183 回答