我想递归删除批处理文件中具有特定扩展名的所有文件。
我知道以下命令:
del /s *.ext
但是,这在 Windows 上也会删除具有其他扩展名的文件,例如 .ext1 或 .ext2 。其原因似乎是此类文件的 8.3 文件名以 .ext 结尾,因此扩展名较长的文件也匹配。
我正在寻找上述命令的替代品,它递归地删除所有具有 .ext 扩展名的文件,但保留具有更长扩展名的文件。
我想递归删除批处理文件中具有特定扩展名的所有文件。
我知道以下命令:
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
当您确定它完全符合您的要求时,请删除故障排除后。
这也使用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.
. 请不要删除任何双引号。
以下是一些替代方法示例,(请记住根据需要调整驱动器/路径/扩展名)
如果您希望坚持使用更传统的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
Stephans
答案是较短的版本,但您也可以使用findstr
's 正则表达式来匹配名称的结尾应该是.ext
for /f "delims=" %%i in ('dir /b /s ^| findstr /IRC:"\.ext$"') do echo del "%%~i"