在批量操作中忽略一个文件夹及其内容
Ignore one folder and its contents in batch operation
我尝试创建一个批处理文件,用于从文件夹中删除所有文件和子目录。我发现有效的命令是这个
FORFILES /p “X:\DAILY MONDAY” /m *.* /c “cmd /c Del /F /Q @path” /d -7 /s & FORFILES /p “X:\DAILY MONDAY” /S /D -7 /C “cmd /c IF @isdir == TRUE rd /S /Q @path”
现在我的用户告诉我在 1 MONDAY 下有一个他们不想清除的 Reference 文件夹(但所有其他子目录应该清空并删除。)谁能告诉我如何完成它?
谢谢!
for /f %%a in ("X:\Daily MONDAY\*") do (if %%a neq "<filename you want to save>" (del %%a))
尚未测试
这应该可以。把你要保存的文件放在<filename you want to save>
根据您提供的信息,我建议您将此作为更新的批处理文件:
@%__AppDir__%forfiles.exe /P "X:\DAILY MONDAY" /C "cmd /C If @IsDir == FALSE 0x28Del /A /F @Path0x29 Else If /I Not @File == 0x22Reference0x22 RD /S /Q @Path" /D -7
就这些,没有其他需要添加或修改的。
使用 FORFILES 执行此类任务效率极低,因为 FORFILES 必须为每个找到的文件启动 cmd.exe
删除超过 7 天的文件并删除每个文件夹。
更好的解决方案是:
@echo off
%SystemRoot%\System32\robocopy.exe "X:\DAILY MONDAY" "X:\DAILY MONDAY\WeeklyDelete" /E /XD "X:\DAILY MONDAY\WeeklyDelete" "X:\DAILY MONDAY\Reference" /MINAGE:7 /MOVE /NDL /NFL /NJH /NJS
if exist "X:\DAILY MONDAY\WeeklyDelete\" rd /Q /S "X:\DAILY MONDAY\WeeklyDelete"
ROBOCOPY 搜索
- 目录中的所有文件
X:\DAILY MONDAY
- 及其子目录包括空目录,因为选项
/E
和
- 由于选项
/XD "X:\DAILY MONDAY\WeeklyDelete" "X:\DAILY MONDAY\Reference"
和 而排除了两个目录 X:\DAILY MONDAY\WeeklyDelete
和 X:\DAILY MONDAY\Reference
及其所有子目录中的文件
- 由于选项
/MINAGE:7
. ,排除了最近 7 天内最后修改的所有文件
找到的符合这些条件的文件和文件夹被移至 X:\DAILY MONDAY\WeeklyDelete
,目标文件夹将自动创建在尚不存在的文件夹中。
选项/NDL /NFL /NJH /NJS
用于不打印移动目录列表、移动文件列表、header和摘要。
仅当移动符合这些条件的所有文件后,文件夹为空时才移动文件夹。因此,包含文件或子文件夹的文件夹不会移动。
选项/S
而不是/E
和选项/MOV
而不是/MOVE
可以用来只移动文件而不移动之前为空的文件夹或移动文件后。
文件和文件夹移动通过 ROBOCOPY 完成得非常快,因为目标文件夹与源文件夹位于同一驱动器上,这意味着只需更新此驱动器的文件系统并且根本不需要移动任何文件数据。
在 ROBOCOPY 完成文件系统更新后使用 IF 条件来移动文件和文件夹以验证目标文件夹是否正确X:\DAILY MONDAY\WeeklyDelete
存在。在这种情况下,由于选项 /Q
,命令 RD 用于悄悄删除此文件夹,并且由于选项 /S
而删除所有文件和子目录。此操作再次只是文件系统更新,并没有真正删除存储在存储介质上的文件数据,因此处理速度非常快。
打开命令提示符 window 并在那里执行以下命令以阅读有关以上三行中使用的命令的更多信息。
echo /?
if /?
rd /?
robocopy /?
命令也有描述
- 由 Microsoft 提供 Windows Commands 和
的文档
- SS64.com 与 A-Z index of Windows CMD commands 以及许多其他网站。
我尝试创建一个批处理文件,用于从文件夹中删除所有文件和子目录。我发现有效的命令是这个
FORFILES /p “X:\DAILY MONDAY” /m *.* /c “cmd /c Del /F /Q @path” /d -7 /s & FORFILES /p “X:\DAILY MONDAY” /S /D -7 /C “cmd /c IF @isdir == TRUE rd /S /Q @path”
现在我的用户告诉我在 1 MONDAY 下有一个他们不想清除的 Reference 文件夹(但所有其他子目录应该清空并删除。)谁能告诉我如何完成它?
谢谢!
for /f %%a in ("X:\Daily MONDAY\*") do (if %%a neq "<filename you want to save>" (del %%a))
尚未测试
这应该可以。把你要保存的文件放在<filename you want to save>
根据您提供的信息,我建议您将此作为更新的批处理文件:
@%__AppDir__%forfiles.exe /P "X:\DAILY MONDAY" /C "cmd /C If @IsDir == FALSE 0x28Del /A /F @Path0x29 Else If /I Not @File == 0x22Reference0x22 RD /S /Q @Path" /D -7
就这些,没有其他需要添加或修改的。
使用 FORFILES 执行此类任务效率极低,因为 FORFILES 必须为每个找到的文件启动 cmd.exe
删除超过 7 天的文件并删除每个文件夹。
更好的解决方案是:
@echo off
%SystemRoot%\System32\robocopy.exe "X:\DAILY MONDAY" "X:\DAILY MONDAY\WeeklyDelete" /E /XD "X:\DAILY MONDAY\WeeklyDelete" "X:\DAILY MONDAY\Reference" /MINAGE:7 /MOVE /NDL /NFL /NJH /NJS
if exist "X:\DAILY MONDAY\WeeklyDelete\" rd /Q /S "X:\DAILY MONDAY\WeeklyDelete"
ROBOCOPY 搜索
- 目录中的所有文件
X:\DAILY MONDAY
- 及其子目录包括空目录,因为选项
/E
和 - 由于选项
/XD "X:\DAILY MONDAY\WeeklyDelete" "X:\DAILY MONDAY\Reference"
和 而排除了两个目录 - 由于选项
/MINAGE:7
. ,排除了最近 7 天内最后修改的所有文件
X:\DAILY MONDAY\WeeklyDelete
和 X:\DAILY MONDAY\Reference
及其所有子目录中的文件
找到的符合这些条件的文件和文件夹被移至 X:\DAILY MONDAY\WeeklyDelete
,目标文件夹将自动创建在尚不存在的文件夹中。
选项/NDL /NFL /NJH /NJS
用于不打印移动目录列表、移动文件列表、header和摘要。
仅当移动符合这些条件的所有文件后,文件夹为空时才移动文件夹。因此,包含文件或子文件夹的文件夹不会移动。
选项/S
而不是/E
和选项/MOV
而不是/MOVE
可以用来只移动文件而不移动之前为空的文件夹或移动文件后。
文件和文件夹移动通过 ROBOCOPY 完成得非常快,因为目标文件夹与源文件夹位于同一驱动器上,这意味着只需更新此驱动器的文件系统并且根本不需要移动任何文件数据。
在 ROBOCOPY 完成文件系统更新后使用 IF 条件来移动文件和文件夹以验证目标文件夹是否正确X:\DAILY MONDAY\WeeklyDelete
存在。在这种情况下,由于选项 /Q
,命令 RD 用于悄悄删除此文件夹,并且由于选项 /S
而删除所有文件和子目录。此操作再次只是文件系统更新,并没有真正删除存储在存储介质上的文件数据,因此处理速度非常快。
打开命令提示符 window 并在那里执行以下命令以阅读有关以上三行中使用的命令的更多信息。
echo /?
if /?
rd /?
robocopy /?
命令也有描述
- 由 Microsoft 提供 Windows Commands 和 的文档
- SS64.com 与 A-Z index of Windows CMD commands 以及许多其他网站。