删除批处理文件中具有特定扩展名的文件
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
我想递归地删除批处理文件中具有特定扩展名的所有文件。
我知道以下命令:
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