我有一些网络驱动器,它们的文件和子文件夹早于特定日期清除。
要删除子文件夹,我倾向于使用如下方式(将网络共享映射到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/*.*
吗?
谢谢, 菲尔
答案 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.exe
和backuplog
时,命令 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文章。