从子文件夹中删除早于特定日期的专门命名的子文件夹

时间:2018-11-13 10:34:10

标签: windows batch-file

我有一些网络驱动器,它们的文件和子文件夹早于特定日期清除。

要删除子文件夹,我倾向于使用如下方式(将网络共享映射到R:之后): forfiles /P "R:" /D -200 /C "cmd /c IF @isdir == TRUE rd /S /Q @path" >> %backuplog% 2>&1

但是,我有一个文件夹结构,该文件夹结构现在填充了名称无法预测的文件夹(因此,我无法非常轻松地直接映射它们),例如

R:/423423423/SIS.d/
R:/543543534/SIS.d/
R:/765465477/SIS.d/

R:中的每个子文件夹都有许多文件和文件夹,但是我想从其中删除所有早于6个月的名为SIS.d的子文件夹。是否可以修改forfiles命令来执行此操作?如果没有,有人可以帮助其他方法吗?

我可以使用类似 /m */SIS.d/*.*吗?

谢谢, 菲尔

1 个答案:

答案 0 :(得分:0)

是的,尽管名称相同,也可以对命令使用命令 FORFILES

%SystemRoot%\System32\forfiles.exe /P "R:\" /M "SIS.d" /S /D -200 /C "%ComSpec% /C if @isdir == TRUE rd /S /Q @path >>"%backuplog%" 2>&1" 2>nul

档案搜索

  • 由于选项R:在驱动器/P "R:\"的根目录中
  • 及其所有子目录(由于选项/S
  • 对于由于SIS.d而与搜索掩码/M "SIS.d"不区分大小写匹配的条目(文件或目录)
  • 由于/D -200的缘故,根据上次修改日期,年龄超过200天

并由于选项/C "..."在命令行中为找到的每个条目执行:

C:\Windows\System32\cmd.exe /C if @isdir == TRUE rd /S /Q @path >>"%backuplog%" 2>&1

%backuplog%也可以在执行命令forfiles之前进行扩展,并希望扩展为完全限定的文件名,而不必在命令行中附加双引号。

cmd.exe首先运行命令 IF 进行区分大小写的比较,如果forfiles@isdir传递给命令的字符串等于字符串{{ 1}}。

在此字符串比较条件为true的情况下,TRUE运行命令 RD 静默删除目录及其所有子目录和文件,这些目录和文件均指定了{{1}引用的完整合格目录名},并由cmd.exe传递给@path,始终用双引号引起来。

命令 RD 的标准输出和错误输出将重定向到名称已分配给环境变量forfiles的文件。使用选项cmd.exebackuplog时,命令 RD 从不输出任何内容来处理 STDOUT 。如果由于各种原因无法完全删除目录,则 RD 将输出一条错误消息来处理 STDERR 。因此,仅使用/S而不是/Q就足够了。

2>>"%backuplog%"当前正在处理的目录的完全删除会导致>>"%backuplog%" 2>&1出现一条错误消息,以处理 STDERR ,该消息最后被附加的forfiles抑制了forfiles命令行。

注意:Windows上的目录分隔符为2>nul(反斜杠),而不是forfiles(正斜杠)。在Windows上,\用于选项,因为在此命令行上可以很好地看到。因此,不要通过在文件和目录参数字符串中使用错误的/而不是/来编写依赖于Windows文件系统内核功能自动更正的命令行。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • /
  • \
  • cmd /?
  • forfiles /?

另请参阅有关Using command redirection operators的Microsoft文章。