[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]求助,批处理删除特定文件夹层级的N天前的脚本

本帖最后由 zs895 于 2017-2-14 10:03 编辑

求助,删除特定文件夹层级的N天前的脚本


我这边要做一个脚本就是删除文件夹下面的子文件夹第三层和第五层的test1,test2的N天前的文件,父文件夹太多,没有办法一个一个写出来手工排除,只能通过脚本实现
我不知道用什么语法怎么实现,我目前只知道用FORFILES删除test1,test2文件夹,但是做不到判断文件夹层级,望高手,大侠门告知一二,谢谢

脚本要实现搜索set t6=D:\test_del\文件夹下面的set t8=test1和set t9=test2,并且子文件set t8=test1和set t9=test2要是3级或者5级子文件夹,下的set t7=0天数之前的文件,将文件日志写到set t4=%date:~10,4%%date:~4,2%%date:~7,2%文件中

如果子文件set t8=test1和set t9=test2要是4级或者其他级子文件夹不做删除动作
  1. @echo off
  2. set t4=%date:~10,4%%date:~4,2%%date:~7,2%
  3. set t5=D:\test_del
  4. set t6=D:\test_del\
  5. set t7=0
  6. set t8=test1
  7. set t9=test2
  8. echo ----------- >> %t5%\%t4%.log
  9. FORFILES /P %t6% /S /M %t8% /d -%t7% /c "cmd /c if @isdir==TRUE del @path /q/a/f/s" >> %t5%\%t4%.log
  10. FORFILES /P %t6% /S /M %t9% /d -%t7% /c "cmd /c if @isdir==TRUE del @path /q/a/f/s" >> %t5%\%t4%.log
  11. echo ----------- >> %t5%\%t4%.log
  12. pause
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

假设今天是3月2号,4天前应该是几月几号啊?

TOP

回复 2# taofan712


    这个应该不是我们关注的吧?系统会自动处理的

TOP

回复 2# taofan712


    forfiles命令本身可以自动处理,不需要人工计算。

TOP

回复 4# GNU


    是的

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :loop
  4. set str=d:\test_del\maybe\there\are\some\pathes\set t3=test3\8ceng
  5. echo;%str%
  6. set /p num=截取判断第几层:
  7. for /l %%i in (1,1,%num%) do set "str=!str:*\=!"
  8. echo %str:\= && 2>nul cd %
  9. pause & goto loop
复制代码
这段代码可以“判断夹层”

TOP

观察输出确认无误后,删除 echo 再运行,需第三方工具 HASH 支持
  1. hash /s:2~2 /t::-2 /do:"echo del ""%%s"""
复制代码

TOP

回复 7# CrLf

这个看不太懂

TOP

下面的代码我的意思是找到第三层的test1和test2文件夹,系统里面有很多的test1和test2文件夹
第三层和第五层刚好处于一个父目录下,我使用这个代码可以执行成功,第四层和他们不处于一个父目录
问题如果我第四层和他们处于一个目录,那我需要再执行一次for循环么?
  1. @echo off
  2. set t4=%date:~10,4%%date:~4,2%%date:~7,2%
  3. set t5=D:\test_del
  4. set t7=0
  5. set t8=test1
  6. set t9=test2
  7. for /d %%a in (%t5%\*) do (
  8.     for /d %%b in (%%a\*) do (
  9.         FORFILES /P %%b /S /M %t8% /d -%t7% /c "cmd /c if @isdir==TRUE @echo del @path /q/a/f/s" >> %t5%\%t4%.log
  10. FORFILES /P %%b /S /M %t9% /d -%t7% /c "cmd /c if @isdir==TRUE @echo del @path /q/a/f/s" >> %t5%\%t4%.log
  11.     )
  12. )
复制代码

TOP

这段代码可以“判断夹层”
taofan712 发表于 2017-2-13 16:41



    看不懂

TOP

本帖最后由 CrLf 于 2017-2-14 11:01 编辑

回复 8# zs895

http://www.bathome.net/viewthread.php?tid=30609

/s:2~2  表示递归路径,只显示其中第二层子目录的内容
  /S[:Min~Max]
              显示指定目录和所有子目录中的文件
               Min~Max 能筛选出 Min < 递归深度 < Max 的文件
              可以用 /S:Min 或 /S:~Max 单独设置上限或下限


/t::-2  表示修改日期为 2 天前,:: 和 : 的区别是 :: 仅用于筛选,而不输出时间信息
* /Tx[:FORMAT | :Min~Max[=Format]]
              Tx 代表显示文件的时间属性(仅能指定一种):
               /TC 创建时间 /TA 上次访问时间 /TW 上次写入时间

              扩展参数可指定范围,Min~Max 能筛选出 Min < 文件日期 < Max 的文件
              可以用 /Tx:Min 或 /Tx:~Max 单独设置上限或下限
              支持常见日期格式,并能进行增减计算,格式为:
               DateTime[[ + | - ]Number[Type]]

              + 为增加,- 为减少,Number 为数量,Type 为单位
              可选的 Type 有:w(周) d(日[默认]) h(时) m(分) s(秒)

               hash *.txt /tw:12:00-5
               rem 列举所有 5天前的12:00 之后修改的 txt 文件
               hash /tc:9:00-10d+12h
               rem 列举所有 10天前的9:00再加12个小时 之后创建的文件

              如果同时明确指定了 Min 与 Max,则会用当前时间自动补充未指定的部分
              将日期补全之后,才会进行日期增减计算
              若日期前缀 * 符号,则会优先用另一半补充未指定的部分如:

               hash /tw:"7/29 0:0"~*8:00
               rem 列举从今年 07/29 00:00 到 同一天的08:00 之间修改的文件

              若参数中含有 % 号,将理解为设置日期显示格式
              日期格式语法参考 strftime 函数,如:

               hash /tw:%Y年%m月%d日
               hash /printf:"%s修改于%s\n",file,tw:"%H时%M分%S秒"

              如果要用一个 /tx 同时指定日期范围与显示格式
              可以用 = 符号表示其后内容为日期格式:

               hash /tc:"00:00+12h"="%y年第%W周"


/do:"echo del ""%%s"""  表示将文件名代入字符串,并执行  echo del "要删除的文件"
  /DO:Format[,Key,...]
  /DOUNTIL:Format[,Key,...]
              语法和 /PRINTF 一致,但效果是执行根据 Format 生成的命令行

              /DO      无论执行结果如何,都将依次执行
              /DOUNTIL 将中止于退出码不为 0 的命令

              效果类似于 forfiles,但使用起来更灵活,如:

               hash /do:"ren ""%s"" ""[%d]%s""",file,n,file
               echo 当前目录下有 %errorlevel% 个 txt 文件
               rem 启用 /return 开关将返回匹配的具体数量

              /PRINTF /DO /DOUNTIL 开关互斥,只能有一个生效
              启用 /RETURN 开关后,将返回最后一条命令的退出码

TOP

回复 11# CrLf

这个明显比较简洁明了,看上去不错

TOP

返回列表