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


    谢谢你的回复,我使用你的代码测试了,输入不同的日期后,有时能删除,有时不能删除(就是说有时能删一个,有时能正确全删,有时没反应),输入的日期我是按 “0000-00-00” 的格式输入的。 我把set qd=2022-11-30 这样直接定义后测试没有效果。

TOP

回复 11# hfxiang


   谢谢你的回复,这个象是linux上的find命令,它也是按修改时间来计算的。我的本意是要用目录的日期形式来判断而进行删除。不是根据目录的创建或修改时间来删除。当然,用时间来计算可以作为最后一种方法来考虑使用,毕竟原备份出来的目录时间是每天的固定时间。
我也测试了下,还是不准确,会存在误删的情况

TOP

请确认以下三点》
一、目录名须是 20??-??-?? 十位带前导零的格式
二、变量qd的输入值格式也须如上所述,且不能用双引号包裹
三、请用最新的简化版代码

TOP

回复 15# xiaoyuwxz


试试7楼的方法
读一读方案5代码上面的那段话:
根据日期出现在文件夹名称中的具体位置,调整第24行字符串截取。
具体语法请参考参考set命令教程第8页
http://bbs.bathome.net/thread-31727-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 19# Batcher


    完全可以了,谢谢!

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

回复 21# hfxiang


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

TOP

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

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

本帖最后由 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

回复 24# 77七


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

TOP

回复  wanyouxi520w

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



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

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

回复 24# 77七


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

评分人数

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

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

返回列表