用于删除具有特定名称的所有子文件夹的批处理命令

Fai*_*yle 35 window batch-file xbmc

我有一个目录:

D:\Movies
D:\Movies\MovieTitle1\backdrops\
D:\Movies\MovieTitle2\backdrops\
D:\Movies\MovieTitle3\backdrops\
D:\Movies\MovieTitle4\backdrops\
Run Code Online (Sandbox Code Playgroud)

我怎么能有一个批处理文件删除所有名为"Backdrops"的文件夹?如果可能的话,我希望它只从D:\驱动器运行递归.

itd*_*itd 66

简短回答:

FOR /d /r . %d IN (backdrops) DO @IF EXIST "%d" rd /s /q "%d"
Run Code Online (Sandbox Code Playgroud)

我从Stack Overflow上同一个问题的无数答案中找到了答案:

命令行工具在Windows中以递归方式删除具有指定名称的文件夹?

此命令未经过测试,但我确实相信此站点足以发布此答案.

正如Alex在评论中所建议的那样,这个批处理脚本应该是万无一失的:

D:
FOR /d /r . %d IN (backdrops) DO @IF EXIST "%d" rd /s /q "%d"
Run Code Online (Sandbox Code Playgroud)

  • 要在批处理文件中使用它,您需要转义`%`char,即用'%% d`替换每个'%d`. (17认同)
  • 要直接在 CMD 提示符下运行此命令,请将“%%d”替换为“%d”。 (6认同)
  • 如果你想在`D:\`上运行这个文件或者在`for/d/r`循环之前添加`cd/d D:\`你想要把这个文件放到`D:\`中 (2认同)
  • 在 Windows 7 上,我必须将部分命令更改为 `"%d" rd /S /Q "%d"`(大写 /s 和 /q)。否则,对非空目录的访问将被拒绝。 (2认同)

JDC*_*JDC 9

上面的答案对我来说不是很有效。我不得不结合使用@itd解决方案和@Groo注释。对他们表示敬意。

对我来说,最终的解决方案是(使用背景文件夹示例):

FOR /d /r . %%d IN ("backdrops") DO @IF EXIST "%%d" rd /s /q "%%d"
Run Code Online (Sandbox Code Playgroud)

  • 以上适用于批处理文件中的命令。如果您希望在命令行中输入此内容,请执行“FOR /d /r”。%d IN ("__pycache__") DO @IF EXIST "%d" rd /s /q "%d"`。 (3认同)
  • 正确的。这对我也有用。我有很多来自 2/3 驱动器的 3k+ node_modules 目录。因此,为了删除所有这些,我创建了 `cmd.bat` 文件并添加了代码 ```FOR /d /r 。%%d IN ("node_modules") DO @IF EXIST "%%d" rd /s /q "%%d"``` 并且它有效。 (2认同)

use*_*036 9

我将打开一个不同的答案,因为它在评论中太局促了。有人问要做什么,如果你想从/到不同的文件夹执行,我想举一个非递归删除的例子。

首先,当你在cmd中使用命令时,你必须使用%d,但是当你在.bat中使用它时,你必须使用%%d.

您可以使用通配符仅处理以“backdrops”开头的文件夹:"backdrops*"

递归删除从 .bat 所在文件夹开始的文件夹:

FOR /d /r . %d IN ("backdrops") DO @IF EXIST "%d" rd /s /q "%d"

非递归删除 .bat 所在文件夹中的文件夹(与通配符一起使用,因为无论如何您不能拥有多个同名文件夹):

FOR /d %d IN ("backdrops*") DO @IF EXIST "%d" rd /s /q "%d"


从您选择的文件夹开始递归删除文件夹:

FOR /d /r "PATH_TO_FOLDER" %d IN ("backdrops") DO @IF EXIST "%d" rd /s /q "%d"

非递归删除您选择的文件夹中的文件夹(与通配符一起使用,因为无论如何您不能拥有多个同名文件夹):

FOR /d %d IN ("PATH_TO_FOLDER/backdrops*") DO @IF EXIST "%d" rd /s /q "%d"


Dud*_*dar 6

我从.Net开发者的角度来看这个问题。有时需要从执行批处理脚本的目录开始递归地擦除所有 */bin/ 和 */obj/ 子文件夹。我尝试了上述解决方案并看到了一个关键点:

与 FOR 命令的其他变体不同,您必须在“folder_set”中包含通配符(* 或 ?)才能获得一致的返回结果。

来源: https: //ss64.com/nt/for_d.html

在删除每个找到的结果之前添加回显时,我们可以确保不存在误报匹配。当我这样做时,我发现使用不带通配符的 (obj)folder_set 会触发每个子文件夹的 DO 表达式,即使它与掩码不匹配。例如删除“/.git/objects/”目录,这是不好的。在掩码末尾添加问号(除了点之外的任何符号出现 0 或 1 次)可以解决此问题:

@echo off

FOR /d /r %%F IN (obj?) DO (
    echo deleting folder: %%F
    @IF EXIST %%F RMDIR /S /Q "%%F"
)

FOR /d /r %%F IN (bin?) DO (
    echo deleting folder: %%F
    @IF EXIST %%F RMDIR /S /Q "%%F"
)
Run Code Online (Sandbox Code Playgroud)

对于任何其他面具也是如此。例如(包?)和(node_modules?)擦除缓存的库以使备份存档更加轻量级。

  • 这很好用,但是您需要在 RMDIR 行中的 %%F 变量周围加上双引号,这样就不会跳过长路径。```@IF EXIST %%F RMDIR /S /Q "%%F"``` 而且很长的路径仍然可能会产生错误。 (2认同)