删除批处理文件中具有特定扩展名的文件

Delete file with specific extension in batch file

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

我知道以下命令:

del /s *.ext

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

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

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

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

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

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

for /f "delims=" %%i in ('dir /b /s ^| findstr /IRC:"\.ext$"') do echo del "%%~i"

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

问题是 where 搜索将 %PATHEXT% 下列出的每个扩展名附加到您的 .ext glob/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.。请不要删除任何双引号。


以下是一些替代方法示例,(请记住根据需要调整drive/path/extension)

如果您希望坚持使用更传统的 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