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

[日期时间] 批处理怎么删除指定多少天前的日期格式目录的文件夹?

如在E:\备份文件\  下有很多时间格式的目录   2022-08-12 2022-09-10 2022-09-11 2022-10-28 2022-10-29  这些目录是通过计划任务每天备份文件生成的,现在想删除30天以前的目录 ,也就是说要删除 2022-10-29以前的所有目录,怎么写批处理。
原先做的是每次在备份后自动删除前30天那一天的备份,那是因为电脑天天开着(给服务器备份mysql数据库用),可以删除30天前每天的备份,但是用来备份工作文件的话,电脑不是每天开着的话,会导到前边的目录会遗留下来,而不能自动删除掉,需手工再去删。

回复 29# WHY


   谢谢大佬指点!第一次遇到 日期在前,年份在后的比较,没有多加思考,我疏忽了。
bat小白,请多指教!谢谢!

TOP

WHY 发表于 2024-6-13 08:34



    这个删除跨年的目录经过验证确实没问题。修补潜在的漏删风险,感谢!

TOP

本帖最后由 aloha20200628 于 2024-6-13 09:41 编辑


29楼所言极是,比较 mmddyyyy 格式的日期要排这个雷... 已订正25楼代码。

TOP

  1. @echo off
  2. for /f %%i in ('PowerShell "(Get-Date).AddDays(-7).ToString('yyyyMMdd')"') do (
  3.     set "DstDate=%%i"
  4. )
  5. setlocal enabledelayedexpansion
  6. for /f %%i in ('dir /b /ad ^|findstr "^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$"') do (
  7.     set "fd=%%i"
  8.     if "!fd:~4!!fd:~0,4!" LEQ "%DstDate%" (
  9.         echo;rd /s /q "%%i"
  10.     )
  11. )
  12. pause
复制代码

TOP

回复 24# 77七


    如果考虑跨年份的情况,比如 2024年1月1日,七天前的日期是 2023年12月25日,"12252023" 这个字符串比 "01012024" 还要大。
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

本帖最后由 newswan 于 2024-6-13 11:40 编辑

powershell 比较简单
  1. $sour = "D:\work"
  2. $dtFormat = "yyyy-MM-dd"
  3. $days = -7
  4. Push-Location -Paht $sour
  5. Get-ChildItem -Directory | ForEach-Object {
  6. $dt = [DateTime]::ParseExact( $_.name , $dtFormat , $null )
  7. if (  $dt -lt (Get-Date).AddDays( $days ) ) {
  8. Remove-Item -Path $_ -Recurse -Force
  9. }
  10. }
  11. Pop-Location
复制代码

TOP

回复  wanyouxi520w

若楼主备份目录中只有形如 mmddyyyy 日期格式的目录,可用更简化的代码如下...
代 ...
aloha20200628 发表于 2024-6-12 17:39



    这个精简代码也可以删除指定日期目录,验证没问题,感谢

TOP

回复 24# 77七


    这个代码验证完全可以删除文件夹,感谢大佬支持。

TOP

本帖最后由 aloha20200628 于 2024-6-13 09:46 编辑

回复 23# wanyouxi520w

若楼主备份目录中只有形如 mmddyyyy 日期格式的目录,可用更简化的代码如下...
代码现状是检测版,如检测无误,可删除第3行代码中 echo, 即改为实际删除版。
如删除日期项不包含第7天,可修改代码第3行中 leq 为 lss 即可.
  1. @echo off &for /f %%d in (' powershell "(get-date).adddays(-7).tostring("""yyyyMMdd""")" ') do (set "days=%%d")
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%D in ('dir /b/ad ????????') do set "d=%%~nD"&if "!d:~4!!d:~,4!" leq "%days%" (echo,rd /q/s "%%D")
  4. endlocal&pause&exit/b
复制代码

TOP

本帖最后由 77七 于 2024-6-13 10:50 编辑

回复 23# wanyouxi520w

  1. @echo off
  2. rem 保存为ansi编码
  3. rem "http://www.bathome.net/viewthread.php?tid=3330"
  4. setlocal
  5. set m=&set d=&set y=
  6. set DaysAgo=7
  7. for /f %%i in ('powershell -c "Get-Date (Get-Date).AddDays(-%DaysAgo%) -uformat "%%m%%d%%Y""') do (
  8.         set "DstDate=%%i"
  9. )
  10. echo,%DstDate%
  11. cd /d "D:\backup"
  12. for /f "delims=" %%i in ('dir /b /ad ^|findstr /rbec:"[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"') do (
  13.         if "%%i" lss "%DstDate%" (
  14.                 echo rd /s /q "%%i"
  15.         )
  16. )
  17. endlocal
  18. pause
复制代码

   显示正确,则去掉第二个 echo 后再执行
代码错误,参考29楼。
bat小白,请多指教!谢谢!

TOP

大佬,楼主这个问题跟我的有些相似,但是代码我不会改。
我的问题是一个路径下,有自动备份的以日期命名的文件夹,比如D:\backup下有06022024  ,06032024,06042024这种日期命名的文件夹,文件夹下是自动备份的文件和子目录。想用批处理自动删除7天前的日期命名的文件夹及子文件夹要怎么改代码呢?

TOP

回复 21# hfxiang


    这代码相当好,测试完全正确。太谢谢了!

TOP

回复 17# xiaoyuwxz


最初没有完全理解题意 ,现在知道了 。以下方法应该完全满足要求,只是稍为复杂了些
  1. @echo off & setlocal enabledelayedexpansion
  2. call :GetDate y m d
  3. call :DateToDays %y% %m% %d% days1
  4. @for /f "tokens=1-3 delims=-" %%a in ('dir /b/ad') do (
  5. call :DateToDays %%a %%b %%c days2
  6. set/a days=days1-days2
  7. if !days! GEQ 30 rd /q /s "%%~fa-%%b-%%c"
  8. )
  9. endlocal
  10. exit/b
  11. :DateToDays %yy% %mm% %dd% days
  12. setlocal ENABLEEXTENSIONS
  13. set yy=%1&set mm=%2&set dd=%3
  14. if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
  15. set /a dd=100%dd%%%100,mm=100%mm%%%100
  16. set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
  17. set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
  18. endlocal&set %4=%j%&goto :EOF
  19. :GetDate yyyy mm dd
  20. setlocal ENABLEEXTENSIONS
  21. set "first="
  22. for /f "tokens=1-3 delims=.-/ " %%a in ('date/t') do (
  23. if not defined first set first=1&set yy=%%a&set mm=%%b&set dd=%%c)
  24. endlocal&set %1=%yy%&set %2=%mm%&set %3=%dd%&goto :EOF
复制代码

TOP

回复 19# Batcher


    完全可以了,谢谢!

TOP

返回列表