【问题标题】:Delete file with specific extension in batch file删除批处理文件中具有特定扩展名的文件
【发布时间】:2020-07-23 06:13:22
【问题描述】:

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

我知道以下命令:

del /s *.ext

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

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

【问题讨论】:

  • 好问题,它似乎只与短扩展名(如三个字母)有关:我尝试使用“test.tralala”和“test.tralalala”和“del /s *.tralala”只删除了一个文件。
  • @Mark:我不同意。这是一段不能按预期工作的代码。它描述了实际结果、期望结果和复制问题的最短代码。
  • 根本不是代码。它是一个键入的命令。
  • @Mark OP 需要一个批处理文件来删除文件,他尝试了批处理文件中的 "command" 并且显然没有做OP想要的,因此这个question 是一个有效的 StackOverflow 问题。
  • @mark,那么batch-file 是什么?它是一个file,带有batches 的“commands”,依次启动...不是吗?

标签: batch-file cmd short-filenames


【解决方案1】:

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

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

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

【讨论】:

  • 我接受这个答案,因为它是解决我的特定问题的最简单方法 - Compo 的答案与我的用例无关。无论如何,其他两个答案都 +1,因为它们都为类似问题添加了有价值的信息。
  • @FourtyTwo,我的回答与所有场景 100% 相关。你的意思是你不关心使代码健壮,因为你无法想象,在你的具体情况下,曾经有一个名为something.ext.comsomething.ext.exesomething.ext.batsomething.ext.cmdsomething.ext.vbs的文件, something.ext.vbesomething.ext.jssomething.ext.jsesomething.ext.wsfsomething.ext.wshsomething.ext.mscsomething.ext.AnyOtherExtensionHeldInPathExt,位于以您未指定的当前目录为根的整个树中的任何位置。
【解决方案2】:

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

问题在于where 搜索会将%PATHEXT% 下列出的每个扩展附加到您的.ext glob/spec。因此,虽然它会删除您的目标文件,但不包括 .ext1.ext2 等文件。它现在将包括例如 *.ext.com*.ext.exe*.ext.bat*.ext.cmd*.ext.vbs、@987654332 @、*.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

【讨论】:

  • 如果感兴趣的人希望看到我提到的where问题的演示,请创建一个两行批处理文件1.@MD "Temporary\SubFolder"&For %%G In (.ext .ext1 .ext2 .ext.com)Do @CD.>"Temporary\madeupname%%G"&CD.>"Temporary\Subfolder\anothername%%G2。@"%__APPDIR__%where.exe" /R "Temporary" "*.ext"&Pause。运行它时,您应该清楚地看到列出的.ext.com 文件。这意味着,如果不取消定义/清空%PATHEXT%,您将有效地删除名称包含字符串.ext 的可执行文件。 (之后不要忘记删除临时目录).
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2015-02-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    相关资源
    最近更新 更多