Board logo

标题: [系统相关] [已解决]批处理如何删除多个指定路径/目录下最后修改日期在指定天数之前的文件 [打印本页]

作者: ygqiang    时间: 2016-7-16 13:23     标题: [已解决]批处理如何删除多个指定路径/目录下最后修改日期在指定天数之前的文件

本帖最后由 pcl_test 于 2016-7-16 21:46 编辑

[已解决]bat删除多个指定路径下指定天数之前的文件,代码哪里出问题了?

1、删除单个指定路径下指定天数之前(以文件的最后修改日期为准)的文件
代码1,功能正常。

2、删除多个指定路径下指定天数之前(以文件的最后修改日期为准)的文件
代码2,功能不正常。并不能删除文件,应该如何修改代码?
作者: ygqiang    时间: 2016-7-16 13:25

本帖最后由 pcl_test 于 2016-7-16 14:25 编辑

代码1:
  1. @echo off & setlocal enabledelayedexpansion
  2. ::演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件。
  3. ::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
  4. ::本例调用了临时VBS代码进行日期计算
  5. ::本例为兼容不同的日期格式,调用reg命令(XP系统自带)统一设置日期格式,
  6. ::处理完毕之后再把日期格式恢复成原来的状态。
  7. rem 指定待删除文件的存放路径
  8. set SrcDir=C:\000\1M
  9. rem 指定天数
  10. set DaysAgo=1
  11. for /f "delims=" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (
  12.     set "RegDateOld=%%a"
  13. )
  14. set RegDateOld=%RegDateOld:~-8%
  15. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul
  16. >"%temp%\DstDate.vbs" echo LastDate=date()-%DaysAgo%
  17. >>"%temp%\DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)
  18. >>"%temp%\DstDate.vbs" echo wscript.echo FmtDate
  19. for /f %%a in ('cscript /nologo "%temp%\DstDate.vbs"') do (
  20.     set "DstDate=%%a"
  21. )
  22. set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%
  23. for /r "%SrcDir%" %%a in (*.*) do (
  24.     if "%%~ta" leq "%DstDate%" (
  25.         if exist "%%a" (
  26.             del /f /q "%%a"
  27.         )
  28.     )
  29. )
  30. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul
  31. pause
复制代码

作者: ygqiang    时间: 2016-7-16 13:27

本帖最后由 pcl_test 于 2016-7-16 14:44 编辑

代码2
  1. @echo off & setlocal enabledelayedexpansion
  2. ::演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件。
  3. ::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
  4. ::本例调用了临时VBS代码进行日期计算
  5. ::本例为兼容不同的日期格式,调用reg命令(XP系统自带)统一设置日期格式,
  6. ::处理完毕之后再把日期格式恢复成原来的状态。
  7. rem 指定待删除文件的存放路径
  8. set SrcDir1=C:\000\1M
  9. set SrcDir2=C:\000\2M
  10. rem 指定天数
  11. set DaysAgo=1
  12. for %%f in ("%SrcDir1%";"%SrcDir2%") do (
  13. set SrcDir=%%f
  14. echo 这里该怎么套用代码1里的代码
  15. )
  16. pause
复制代码

作者: pcl_test    时间: 2016-7-16 20:16

本帖最后由 pcl_test 于 2016-7-17 12:48 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. rem -1为一天前、-2为两天前……以此类推
  3. set DaysAgo=-1
  4. rem 指定需处理的文件类型/扩展名,默认为所有类型文件,如需处理所有txt文件,则修改为set FileExt=*.txt
  5. set FileExt=
  6. for /f "tokens=3" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do set "RegDateOld=%%a"
  7. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-MM-dd /f >nul
  8. for /f %%a in ('mshta VBScript:Execute("NewDate=date()+(%DaysAgo%):FmtDate=right(year(NewDate),4)&right(""0""&month(NewDate),2)&right(""0""&day(NewDate),2):CreateObject(""Scripting.FileSystemObject"").GetStandardStream(1).Write FmtDate:close"^)') do set "dstDate=%%a"
  9. for /f "delims=" %%a in ('more +23 "%~f0"') do (
  10.     if exist "%%a" (
  11.         cd /d "%%a"
  12.         for /f "delims=" %%b in ('dir /a-d/b/s %FileExt%') do (
  13.             for /f "tokens=1" %%c in ("%%~tb") do set srcDate=%%c
  14.             set srcDate=!srcDate:-=!
  15.             set srcDate=!srcDate:/=!
  16.             echo;if !srcDate! lss %dstDate% del "%%b" /q
  17.         )
  18.     ) else echo;%%a 不存在
  19. )
  20. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f >nul
  21. echo;Done
  22. pause&exit
  23. ::文件夹列表
  24. c:\000\00-00\APILog
  25. c:\000\00-00\SysLog
复制代码

作者: ygqiang    时间: 2016-7-16 20:27

本帖最后由 ygqiang 于 2016-7-16 21:09 编辑

回复 4# pcl_test



rem 指定待删除文件的存放路径
set SrcDir1=C:\000\1M
set SrcDir2=C:\000\2M
set SrcDir3=C:\000\3M
...

rem 指定天数
set DaysAgo=1

rem 指定扩展名
set FileExt=log




最好这几个参数,都放在bat文件的最顶上。这样方便根据需要,手动修改下
谢谢版主,找别人搞定了。。

请PM你的支付宝账户,给你打款表示感谢。
作者: ygqiang    时间: 2016-7-16 21:07

本帖最后由 pcl_test 于 2016-7-17 12:50 编辑

解决了。
  1. @echo off & setlocal enabledelayedexpansion
  2. ::演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件。
  3. ::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
  4. ::本例调用了临时VBS代码进行日期计算
  5. ::本例为兼容不同的日期格式,调用reg命令(XP系统自带)统一设置日期格式,
  6. ::处理完毕之后再把日期格式恢复成原来的状态。
  7. rem 指定待删除文件的存放路径
  8. set SrcDir1=c:\000\00-00\APILog
  9. set SrcDir2=c:\000\00-00\SysLog
  10. set SrcDir3=e:\test
  11. rem 指定天数
  12. set DaysAgo=1
  13. rem 指定类型
  14. set FileExt=log
  15. for /f "delims=" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (
  16.     set "RegDateOld=%%a"
  17. )
  18. set RegDateOld=%RegDateOld:~-8%
  19. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul
  20. >"%temp%\DstDate.vbs" echo LastDate=date()-%DaysAgo%
  21. >>"%temp%\DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)
  22. >>"%temp%\DstDate.vbs" echo wscript.echo FmtDate
  23. for /f %%a in ('cscript /nologo "%temp%\DstDate.vbs"') do (
  24.     set "DstDate=%%a"
  25. )
  26. set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%
  27. for /l %%a in (1 1 1000) do (
  28.   call :ok SrcDir%%a
  29.   if errorlevel 5 goto :end
  30. )
  31. :end
  32. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul
  33. pause&exit
  34. :ok
  35. echo %1
  36. if not defined %1 exit /b 5
  37.   for /f "delims=" %%b in ('dir /s /b !%1!\*.%FileExt%') do (
  38.     if "%%~tb" leq "%DstDate%" (
  39.         if exist "%%b" (
  40.             del /f /q "%%b"
  41.         )
  42.     )
  43.   )
  44. exit /b
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2