【问题标题】:Ignore one folder and its contents in batch operation批量操作时忽略一个文件夹及其内容
【发布时间】:2020-09-01 20:08:36
【问题描述】:

我尝试创建一个批处理文件,该批处理文件将从文件夹中删除所有文件和子目录。我发现有效的命令是这个

FORFILES /p “X:\DAILY\1 MONDAY” /m *.* /c “cmd /c Del /F /Q @path” /d -7 /s & FORFILES /p “X:\DAILY\1 MONDAY” /S /D -7 /C “cmd /c IF @isdir == TRUE rd /S /Q @path”

现在我的用户告诉我在 1 MONDAY 下有一个他们不想清除的 Reference 文件夹(但所有其他子目录都应该清空和删除。)谁能告诉我如何实现这一点?

谢谢!

【问题讨论】:

    标签: batch-file forfiles


    【解决方案1】:
    for /f %%a in ("X:\Daily\1 MONDAY\*") do (if %%a neq "<filename you want to save>" (del %%a))
    

    尚未测试

    这应该可以。把你要保存的文件放在&lt;filename you want to save&gt;

    【讨论】:

    • 感谢您的回复。 :) 抱歉,但我不知道如何使用它。它是附加还是在 FORFILES 命令之前?它是独立存在的吗?我已经尝试过各种方式,但它总是抛出错误。
    • 检查for /?。 For 是许多语言中的基本命令,但批处理迭代有点独特。它独立存在。
    【解决方案2】:

    对于这样的任务使用 FORFILES 效率极低,因为 FORFILES 必须为找到的每个文件启动 cmd.exe 以删除超过 7 天的文件,并且要删除的每个文件夹。

    更好的解决方案是:

    @echo off
    %SystemRoot%\System32\robocopy.exe "X:\DAILY\1 MONDAY" "X:\DAILY\1 MONDAY\WeeklyDelete" /E /XD "X:\DAILY\1 MONDAY\WeeklyDelete" "X:\DAILY\1 MONDAY\Reference" /MINAGE:7 /MOVE /NDL /NFL /NJH /NJS
    if exist "X:\DAILY\1 MONDAY\WeeklyDelete\" rd /Q /S "X:\DAILY\1 MONDAY\WeeklyDelete"
    

    ROBOCOPY 搜索

    • 对于目录X:\DAILY\1 MONDAY中的所有文件
    • 及其子目录包括空目录,因为选项 /E 带有
    • 排除X:\DAILY\1 MONDAY\WeeklyDeleteX:\DAILY\1 MONDAY\Reference这两个目录中的文件及其所有子目录,因为/XD "X:\DAILY\1 MONDAY\WeeklyDelete" "X:\DAILY\1 MONDAY\Reference"选项带有
    • 由于选项 /MINAGE:7,排除了过去 7 天内最后修改的所有文件。

    找到的符合这些条件的文件和文件夹被移动到X:\DAILY\1 MONDAY\WeeklyDelete,从而自动创建目标文件夹不存在。

    /NDL /NFL /NJH /NJS 选项用于打印移动目录列表、移动文件列表、标题和摘要。

    只有在移动符合这些条件的所有文件后,文件夹为空时才会移动。因此,文件夹不会继续包含文件或子文件夹。

    选项/S 代替/E 和选项/MOV 代替/MOVE 可用于仅移动文件并且不移动在移动文件之前或之后为空的文件夹。

    ROBOCOPY 可以非常快速地完成文件和文件夹的移动,因为目标文件夹与源文件夹位于同一驱动器上,这意味着只需更新此驱动器的文件系统,无需更新文件数据完全动了。

    ROBOCOPY 完成更新文件系统以移动文件和文件夹以验证目标文件夹 X:\DAILY\1 MONDAY\WeeklyDelete 是否存在后,使用 IF 条件。在这种情况下,由于选项 /Q,命令 RD 用于悄悄删除此文件夹,并由于选项 /S 而删除所有文件和子目录。此操作再次只是文件系统更新,并没有真正删除存储在存储介质上的文件数据,因此处理速度非常快。

    打开命令提示符窗口并在其中执行以下命令,以了解以上三行中使用的命令的更多信息。

    • echo /?
    • if /?
    • rd /?
    • robocopy /?

    还描述了命令

    【讨论】:

    • 感谢您的详细回复!我已阅读文档,但我不太清楚如何使用“不等于”以及其他内容。很抱歉造成双重帖子的问题;我认为这个问题与第一个问题不同,值得提出。道歉。
    【解决方案3】:

    根据您提供的信息,我建议您将此作为更新的批处理文件:

    @%__AppDir__%forfiles.exe /P "X:\DAILY\1 MONDAY" /C "cmd /C If @IsDir == FALSE 0x28Del /A /F @Path0x29 Else If /I Not @File == 0x22Reference0x22 RD /S /Q @Path" /D -7
    

    仅此而已,无需添加或修改其他内容。

    【讨论】:

    • @unityco,虽然forfiles 命令不是运行效率最高的,但此版本比您发布的版本要高效得多。首先,它只运行一次ForFiles,而不是两次,而且它们都不是递归的。它只是删除 X:\DAILY\1 MONDAY 中超过 7 天的所有文件和目录,但忽略 X:\DAILY\1 MONDAY\REFERENCE 目录。根据您现在应该删除的重复问题。您也可以直接从 cmd.exe 运行同一行(尽管您可以删除第一个字符 @,如果您愿意)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 2014-01-04
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多