Board logo

标题: [日期时间] 批处理删除指定天数日期之前的文件(2023-10-08) [打印本页]

作者: Batcher    时间: 2009-2-14 03:32     标题: 批处理删除指定天数日期之前的文件(2023-10-08)

【方案1】以文件的最后修改时间为准 BAT + PowerShell
  1. @echo off
  2. REM ------------------------------------------------------------------------------
  3. REM 如果显示的待删除文件列表正确无误
  4. REM 把 Select-Object FullName 修改成 Remove-Item -Force 再次执行即可真正删除文件
  5. REM Win7/Win8/Win10等系统自带PowerShell
  6. REM ------------------------------------------------------------------------------
  7. REM 指定待删除文件的存放路径
  8. set "SrcDir=C:\Test\BatHome"
  9. REM 指定天数
  10. set "DaysAgo=10"
  11. powershell -c "Get-ChildItem -Path '%SrcDir%' -Recurse -ErrorAction:SilentlyContinue | Where-Object -FilterScript {(((get-date) - ($_.LastWriteTime)).days -gt %DaysAgo% -and $_.PsISContainer -ne $True)} | Select-Object FullName"
  12. pause
复制代码
【方案2】以文件的创建时间为准 BAT + PowerShell
  1. @echo off
  2. REM ------------------------------------------------------------------------------
  3. REM 如果显示的待删除文件列表正确无误
  4. REM 把 Select-Object FullName 修改成 Remove-Item -Force 再次执行即可真正删除文件
  5. REM Win7/Win8/Win10等系统自带PowerShell
  6. REM ------------------------------------------------------------------------------
  7. REM 指定待删除文件的存放路径
  8. set "SrcDir=C:\Test\BatHome"
  9. REM 指定天数
  10. set "DaysAgo=10"
  11. powershell -c "Get-ChildItem -Path '%SrcDir%' -Recurse -ErrorAction:SilentlyContinue | Where-Object -FilterScript {(((get-date) - ($_.CreationTime)).days -gt %DaysAgo% -and $_.PsISContainer -ne $True)} | Select-Object FullName"
  12. pause
复制代码
【方案3-1】以文件的修改日期为准 forfiles
  1. @echo off
  2. REM ------------------------------------------------------------------------------
  3. REM 演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件。
  4. REM 如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
  5. REM Win7/Win8/Win10等系统自带forfiles命令
  6. REM ------------------------------------------------------------------------------
  7. REM 指定待删除文件的存放路径
  8. set "SrcDir=C:\Test\BatHome"
  9. REM 指定天数
  10. set "DaysAgo=1"
  11. forfiles /p %SrcDir% /s /m *.* /d -%DaysAgo% /c "cmd /c echo del /f /q /a @path"
  12. pause
复制代码
【方案3-2】forfiles 删除指定日期之前的txt文件,且排除指定文件名的某个文件:
  1. @echo off
  2. REM ------------------------------------------------------------------------------
  3. REM 演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件。
  4. REM 如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
  5. REM Win7/Win8/Win10等系统自带forfiles命令
  6. REM ------------------------------------------------------------------------------
  7. REM 指定待删除文件的存放路径
  8. set "SrcDir=C:\Test\BatHome"
  9. REM 指定天数
  10. set "DaysAgo=3"
  11. REM 指定排除的文件名
  12. set "ExcludeFile=BatHome.txt"
  13. for /f "delims=" %%i in ('forfiles /p %SrcDir% /s /m *.txt /d -%DaysAgo% /c "cmd /c echo @path"') do (
  14.     if "%%~nxi" neq "%ExcludeFile%" (
  15.         echo del /f /q "%%i"
  16.     )
  17. )
  18. pause
复制代码
【方案4】以文件的最后修改时间为准 BAT + REG + VBS
  1. @echo off
  2. REM ------------------------------------------------------------------------------
  3. REM 演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件。
  4. REM 如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
  5. REM 本例调用了临时VBS代码进行日期计算
  6. REM 本例为兼容不同的日期格式,调用reg命令(XP系统自带)统一设置日期格式,
  7. REM 处理完毕之后再把日期格式恢复成原来的状态。
  8. REM ------------------------------------------------------------------------------
  9. REM 指定待删除文件的存放路径
  10. set "SrcDir=C:\Test\BatHome"
  11. REM 指定天数
  12. set "DaysAgo=1"
  13. for /f "delims=" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (
  14.     set "RegDateOld=%%a"
  15. )
  16. set RegDateOld=%RegDateOld:~-8%
  17. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul
  18. >"%temp%\DstDate.vbs" echo LastDate=date()-%DaysAgo%
  19. >>"%temp%\DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)
  20. >>"%temp%\DstDate.vbs" echo wscript.echo FmtDate
  21. for /f %%a in ('cscript /nologo "%temp%\DstDate.vbs"') do (
  22.     set "DstDate=%%a"
  23. )
  24. set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%
  25. for /r "%SrcDir%" %%a in (*.*) do (
  26.     if "%%~ta" leq "%DstDate%" (
  27.         if exist "%%a" (
  28.             echo del /f /q "%%a"
  29.         )
  30.     )
  31. )
  32. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul
  33. pause
复制代码
【方案5】以文件的最后修改时间为准 BAT + REG + Ritchie Lawrence 日期函数
  1. @echo off
  2. REM ------------------------------------------------------------------------------
  3. REM 演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件。
  4. REM 如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
  5. REM 本例调用了 Ritchie Lawrence 的日期函数进行日期计算
  6. REM 日期转换的核心算法请参考http://bbs.bathome.cn/thread-3056-1-1.html
  7. REM 本例为兼容不同的日期格式,调用reg命令(XP系统自带)统一设置日期格式,
  8. REM 处理完毕之后再把日期格式恢复成原来的状态。
  9. REM ------------------------------------------------------------------------------
  10. REM 指定待删除文件的存放路径
  11. set "SrcDir=C:\Test\BatHome"
  12. REM 指定天数
  13. set "DaysAgo=1"
  14. for /f "delims=" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (
  15.     set "RegDateOld=%%a"
  16. )
  17. set RegDateOld=%RegDateOld:~-8%
  18. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul
  19. call :DateToDays %date:~0,4% %date:~5,2% %date:~8,2% PassDays
  20. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul
  21. set /a PassDays-=%DaysAgo%
  22. call :DaysToDate %PassDays% DstYear DstMonth DstDay
  23. set DstDate=%DstYear%-%DstMonth%-%DstDay%
  24. for /r "%SrcDir%" %%a in (*.*) do (
  25.     if "%%~ta" leq "%DstDate%" (
  26.         if exist "%%a" (
  27.             echo del /f /q "%%a"
  28.         )
  29.     )
  30. )
  31. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul
  32. pause
  33. goto :eof
  34. :DateToDays %yy% %mm% %dd% days
  35. setlocal ENABLEEXTENSIONS
  36. set yy=%1&set mm=%2&set dd=%3
  37. if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
  38. set /a dd=100%dd%%%100,mm=100%mm%%%100
  39. set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
  40. set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
  41. endlocal&set %4=%j%&goto :EOF
  42. :DaysToDate %days% yy mm dd
  43. setlocal ENABLEEXTENSIONS
  44. set /a a=%1+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
  45. set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
  46. set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
  47. (if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
  48. endlocal&set %2=%yy%&set %3=%mm%&set %4=%dd%&goto :EOF
复制代码
【方案6】以文件的最后修改时间为准 BAT + VBS
  1. @echo off
  2. REM ------------------------------------------------------------------------------
  3. REM 演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件。
  4. REM 如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
  5. REM 本例调用了临时VBS代码进行日期计算,并统一设置系统日期格式,处理完毕
  6. REM 之后再把日期格式恢复成原来的状态。摆脱了对reg命令(XP系统自带)的依赖。
  7. REM ------------------------------------------------------------------------------
  8. REM 指定待删除文件的存放路径
  9. set "SrcDir=C:\Test\BatHome"
  10. REM 指定天数
  11. set "DaysAgo=1"
  12. >"%temp%\BackupDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")
  13. >>"%temp%\BackupDate.vbs" echo WScript.Echo WshShell.RegRead ("HKEY_CURRENT_USER\Control Panel\International\sShortDate")
  14. for /f %%a in ('cscript /nologo "%temp%\BackupDate.vbs"') do (
  15.     set "RegDateOld=%%a"
  16. )
  17. >"%temp%\UnifyDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")
  18. >>"%temp%\UnifyDate.vbs" echo WshShell.RegWrite "HKEY_CURRENT_USER\Control Panel\International\sShortDate", "yyyy-M-d", "REG_SZ"
  19. cscript /nologo "%temp%\UnifyDate.vbs"
  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 /r "%SrcDir%" %%a in (*.*) do (
  28.     if "%%~ta" leq "%DstDate%" (
  29.         if exist "%%a" (
  30.             echo del /f /q "%%a"
  31.         )
  32.     )
  33. )
  34. >"%temp%\RecoverDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")
  35. >>"%temp%\RecoverDate.vbs" echo WshShell.RegWrite "HKEY_CURRENT_USER\Control Panel\International\sShortDate", "%RegDateOld%", "REG_SZ"
  36. cscript /nologo "%temp%\RecoverDate.vbs"
  37. pause
复制代码
【方案7】以文件的创建时间为准 BAT + REG + Ritchie Lawrence 日期函数
  1. @echo off
  2. REM ------------------------------------------------------------------------------
  3. REM 演示:删除指定路径下指定天数之前(以文件的创建日期为准)的文件。
  4. REM 如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
  5. REM 本例调用了 Ritchie Lawrence 的日期函数进行日期计算
  6. REM 日期转换的核心算法请参考http://bbs.bathome.cn/thread-3056-1-1.html
  7. REM 本例为兼容不同的日期格式,调用reg命令(XP系统自带)统一设置日期格式,
  8. REM 处理完毕之后再把日期格式恢复成原来的状态。
  9. REM ------------------------------------------------------------------------------
  10. REM 指定待删除文件的存放路径
  11. set "SrcDir=C:\Test\BatHome"
  12. REM 指定天数
  13. set "DaysAgo=1"
  14. for /f "delims=" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (
  15.     set "RegDateOld=%%a"
  16. )
  17. set RegDateOld=%RegDateOld:~-8%
  18. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul
  19. call :DateToDays %date:~0,4% %date:~5,2% %date:~8,2% PassDays
  20. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul
  21. set /a PassDays-=%DaysAgo%
  22. call :DaysToDate %PassDays% DstYear DstMonth DstDay
  23. set DstDate=%DstYear%-%DstMonth%-%DstDay%
  24. for /f "delims=/" %%a in ('dir /s /b /a-d "%SrcDir%"') do (
  25.     call :CompareTime "%%a"
  26. )
  27. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul
  28. pause
  29. goto :eof
  30. :DateToDays %yy% %mm% %dd% days
  31. setlocal ENABLEEXTENSIONS
  32. set yy=%1&set mm=%2&set dd=%3
  33. if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
  34. set /a dd=100%dd%%%100,mm=100%mm%%%100
  35. set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
  36. set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
  37. endlocal&set %4=%j%&goto :EOF
  38. :DaysToDate %days% yy mm dd
  39. setlocal ENABLEEXTENSIONS
  40. set /a a=%1+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
  41. set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
  42. set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
  43. (if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
  44. endlocal&set %2=%yy%&set %3=%mm%&set %4=%dd%&goto :EOF
  45. :CompareTime
  46. for /f "skip=5 tokens=1-2 delims= " %%h in ('dir /a-d /tc %1') do (
  47.     if "%%h" leq "%DstDate%" (
  48.         if exist %1 (
  49.             echo del /a /f /q %1
  50.         )
  51.     )
  52.     goto :eof
  53. )
复制代码
【方案8】以文件名中包含的日期字符串为准 字符串截取
  1. @echo off
  2. REM ------------------------------------------------------------------------------
  3. REM 演示:删除指定路径下指定天数之前(以文件名中包含的日期字符串为准)的文件。
  4. REM 如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
  5. REM 本例假设文件名中包含的日期字符串(比如:bak-2009-12-25.log)
  6. REM ------------------------------------------------------------------------------
  7. REM 指定待删除文件的存放路径
  8. set "SrcDir=C:\Test\BatHome"
  9. REM 指定天数
  10. set "DaysAgo=1"
  11. >"%temp%\DstDate.vbs" echo LastDate=date()-%DaysAgo%
  12. >>"%temp%\DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)
  13. >>"%temp%\DstDate.vbs" echo wscript.echo FmtDate
  14. for /f %%a in ('cscript /nologo "%temp%\DstDate.vbs"') do (
  15.   set "DstDate=%%a"
  16. )
  17. set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%
  18. setlocal enabledelayedexpansion
  19. for /r "%SrcDir%" %%a in (*.*) do (
  20.     set "FileDate=%%~na"
  21.     set "FileDate=!FileDate:~4,10!"
  22.     if "!FileDate!" leq "%DstDate%" (
  23.         if exist "%%a" (
  24.             echo del /f /q "%%a"
  25.         )
  26.     )
  27. )
  28. endlocal
  29. pause
复制代码

作者: thth    时间: 2009-6-3 09:11     标题: 回复 1楼 的帖子

看了楼主贴很有收获,先谢谢了!
不过,我在试了方案一发现在日期比较的时候好像有问题,我就把去掉@echo off 显示出来的打出来:
if "09-06-01 08:56" LEQ "2009-05-29" (if-----
后面我省略了,
正常情况应该是前面比后面的日期大,可是由于格式不对,造成后面的总是大,所以把该要的和不要都删除了。
我不知道是那个地方的问题。我是在2000测试的。
作者: Batcher    时间: 2009-6-3 09:27     标题: 回复 2楼 的帖子

方案一的描述中已经说明了需要reg命令的支持,但是Win2000系统中是没有这个命令的。请选择方案三。
作者: thth    时间: 2009-6-3 10:45     标题: 回复 3楼 的帖子

我用的2000下是没有reg这个命令,但是我从别的机子上考了一个这个命令,运行时reg的语句没有显示出错,我在2000下4个方案都不能成功运行,从显示出来看还是日期格式不对。
不过我在xp下运行只有方案二不能运行,其他都可以很好的运行。
xp下有代码能用就好了,不求甚解了。
谢谢楼主的回答。
作者: Batcher    时间: 2009-6-3 10:51     标题: 回复 4楼 的帖子

你在2000中:开始,运行,cmd,echo %date%,结果贴出来看看。
我帮你写一个2000中可以运行的。

另外,能否把方案三的@echo off删除,把它在2000中运行的完整过程贴出来看看?
作者: jamesst    时间: 2009-6-12 10:03     标题: 需求

楼主,如果我想删除指定文件夹下、指定天数日期之前、指定文件名(有规则的)的文件,怎么实现呢?
急~~在线等,拜托了。
作者: Batcher    时间: 2009-6-12 10:09     标题: 回复 6楼 的帖子

我没有未卜先知的能力,无法猜出你的文件名规则是什么。不知道该如何帮你。
抱歉。
作者: jamesst    时间: 2009-6-12 10:38

专门定制?呵呵,谢谢楼主了!!
文件名字举例:今天生成的就是“2009-06-12”,昨天的是“2009-06-11”,没有扩展名,以此类推。
注意该目录下还有很多其它文件不能删哦
作者: jamesst    时间: 2009-6-12 11:43

在线等。。。。。。。。。。。
作者: Batcher    时间: 2009-6-12 13:13     标题: 回复 8楼 的帖子

  1. @echo off
  2. ::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
  3. rem 指定待删除文件的存放路径
  4. set SrcDir=C:\Test
  5. rem 指定天数
  6. set DaysAgo=7
  7. rem 假设日期格式为:2009-06-12 星期五
  8. call :DateToDays %date:~0,4% %date:~5,2% %date:~8,2% PassDays
  9. set /a PassDays-=%DaysAgo%
  10. call :DaysToDate %PassDays% DstYear DstMonth DstDay
  11. set DstDate=%DstYear%-%DstMonth%-%DstDay%
  12. for /f "delims=/" %%a in ('dir /b /a-d "%SrcDir%"') do (
  13.   if "%%a" leq "%DstDate%" (
  14.     echo del /a /f /q "%SrcDir%\%%a"
  15.   )
  16. )
  17. pause
  18. goto :eof
  19. :DateToDays %yy% %mm% %dd% days
  20. setlocal ENABLEEXTENSIONS
  21. set yy=%1&set mm=%2&set dd=%3
  22. if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
  23. set /a dd=100%dd%%%100,mm=100%mm%%%100
  24. set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
  25. set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
  26. endlocal&set %4=%j%&goto :EOF
  27. :DaysToDate %days% yy mm dd
  28. setlocal ENABLEEXTENSIONS
  29. set /a a=%1+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
  30. set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
  31. set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
  32. (if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
  33. endlocal&set %2=%yy%&set %3=%mm%&set %4=%dd%&goto :EOF
复制代码

作者: jamesst    时间: 2009-6-12 14:11

详见附件。
这个bat还多删除了两个其它文件,请判断,辛苦啦。

原始目录内容如下:
驱动器 E 中的卷没有标签。
卷的序列号是 13A4-CA45

E:\123123 的目录

2009-06-12  14:12    <DIR>          .
2009-06-12  14:12    <DIR>          ..
2009-06-12  14:12                 0 1.txt
2009-05-20  11:47            20,609 2009-05-24
2009-05-20  11:47            20,609 2009-05-25
2009-05-20  11:47            20,609 2009-05-26
2009-05-20  11:47            20,609 2009-05-27
2009-05-20  11:47            20,609 2009-05-28
2009-05-20  11:47            20,609 2009-05-29
2009-05-20  11:47            20,609 2009-05-30
2009-05-20  11:47            20,609 2009-05-31
2009-05-20  11:47            20,609 2009-06-01
2009-05-20  11:47            20,609 2009-06-02
2009-05-20  11:47            20,609 2009-06-03
2009-05-20  11:47            20,609 2009-06-04
2009-05-20  11:47            20,609 2009-06-05
2009-05-20  11:47            20,609 2009-06-06
2009-05-20  11:47            20,609 2009-06-07
2009-05-20  11:47            20,609 2009-06-08
2009-05-20  11:47            20,609 2009-06-09
2009-05-20  11:47            20,609 2009-06-10
2009-05-20  11:47            20,609 2009-06-11
2009-05-20  11:47            20,609 2009-06-12
2004-07-21  07:48        18,331,779 Oracle 9i中文版实用培训教程.pdf
2005-07-13  23:32        19,664,908 Oracle备份与恢复培训教程.pdf
2008-10-14  11:24           480,909 S60_Platform_FAQ_v1_12_en.pdf
2004-10-02  09:49            44,032 UnMakeSIS.exe
2008-03-24  13:03         8,838,445 wolf学习笔记.pdf
2002-03-05  06:01         7,714,572 XML编程从入门到精通.pdf
2008-10-14  10:54           127,544 x_S60.sis
2008-09-10  13:19        36,601,098 [买股票,找这样的公司就对了].pdf
2005-01-13  10:02           651,487 《管理就这么简单》.pdf
2008-10-04  19:03         2,430,968 公司OA考勤管理系统.rar
2009-02-04  00:45           207,872 生意架构__2003.xls
2008-10-13  13:05         8,594,865 非C程序员C++入门自学教程.PDF
              33 个文件    104,100,659 字节
作者: jamesst    时间: 2009-6-12 14:13

补充,我修改的bat内容如下:
@echo off
::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
rem 指定待删除文件的存放路径
set SrcDir=E:\123123
rem 指定天数
set DaysAgo=15
rem 假设日期格式为:2009-06-12 星期五
call ateToDays %date:~0,4% %date:~5,2% %date:~8,2% PassDays
set /a PassDays-=%DaysAgo%
call :DaysToDate %PassDays% DstYear DstMonth DstDay
set DstDate=%DstYear%-%DstMonth%-%DstDay%

for /f "delims=/" %%a in ('dir /b /a-d "%SrcDir%"') do (
  if "%%a" leq "%DstDate%" (
    echo del /a /f /q "%SrcDir%\%%a"
  )
)
pause
goto :eof

:DateToDays %yy% %mm% %dd% days
setlocal ENABLEEXTENSIONS
set yy=%1&set mm=%2&set dd=%3
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
endlocal&set %4=%j%&goto :EOF

:DaysToDate %days% yy mm dd
setlocal ENABLEEXTENSIONS
set /a a=%1+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
endlocal&set %2=%yy%&set %3=%mm%&set %4=%dd%&goto :EOF
作者: Batcher    时间: 2009-6-12 15:16     标题: 回复 12楼 的帖子

  1. @echo off
  2. ::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
  3. rem 指定待删除文件的存放路径
  4. set SrcDir=E:\123123
  5. rem 指定天数
  6. set DaysAgo=15
  7. rem 假设日期格式为:2009-06-12 星期五
  8. call :DateToDays %date:~0,4% %date:~5,2% %date:~8,2% PassDays
  9. set /a PassDays-=%DaysAgo%
  10. call :DaysToDate %PassDays% DstYear DstMonth DstDay
  11. set DstDate=%DstYear%-%DstMonth%-%DstDay%
  12. for /f "delims=/" %%a in ('dir /b /a-d "%SrcDir%\????-??-??"') do (
  13.   if "%%a" leq "%DstDate%" (
  14.     echo del /a /f /q "%SrcDir%\%%a"
  15.   )
  16. )
  17. pause
  18. goto :eof
  19. :DateToDays %yy% %mm% %dd% days
  20. setlocal ENABLEEXTENSIONS
  21. set yy=%1&set mm=%2&set dd=%3
  22. if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
  23. set /a dd=100%dd%%%100,mm=100%mm%%%100
  24. set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
  25. set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
  26. endlocal&set %4=%j%&goto :EOF
  27. :DaysToDate %days% yy mm dd
  28. setlocal ENABLEEXTENSIONS
  29. set /a a=%1+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
  30. set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
  31. set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
  32. (if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
  33. endlocal&set %2=%yy%&set %3=%mm%&set %4=%dd%&goto :EOF
复制代码

作者: jamesst    时间: 2009-6-12 17:18

完全ok了,楼主的功力不是一般的强啊,拜服~~~~~~
作者: qq43142691    时间: 2009-6-14 02:25

原帖由 Batcher 于 2009-6-12 13:13 发表
@echo off
::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
rem 指定待删除文件的存放路径
set SrcDir=C:\Test
rem 指定天数
set DaysAgo=7
rem 假设日期格式为:2009-06-12 星期五
call ate ...


如果我猜的没错的话...这个是 cn-dos 联盟里面的吧...
作者: Batcher    时间: 2009-6-14 12:22     标题: 回复 15楼 的帖子

非常可惜的是,你猜错了。
顶楼说的很清楚,日期函数是 Ritchie Lawrence 写的。
作者: xiongmao    时间: 2009-7-11 16:00

请教楼主,我的系统2000 SERVER ,日期格式为星期六 2009-07-11 ,怎么实现 利用方案三,出现日期判断不正确的现象“E:\>(if "09-07-11 14:46 " LEQ "2009-07-05" ”,如何批处理实现?谢谢!
作者: Batcher    时间: 2009-7-11 16:27     标题: 回复 17楼 的帖子

打开注册表编辑器,看看这个键值是什么样子的:
HKEY_CURRENT_USER\Control Panel\International\sShortDate
作者: xiongmao    时间: 2009-7-13 09:14

回复楼主:yyyy-MM-dd
作者: xiongmao    时间: 2009-7-13 09:21

运行,cmd,echo %date%,显示格式为:星期一  2009-07-13
作者: Batcher    时间: 2009-7-13 09:43     标题: 回复 20楼 的帖子

  1. @echo off
  2. ::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
  3. rem 指定待删除文件的存放路径
  4. set SrcDir=C:\Test\BatHome
  5. rem 指定天数
  6. set DaysAgo=1
  7. rem 假设日期格式为:星期一 2009-07-13
  8. call :DateToDays %date:~4,4% %date:~9,2% %date:~12,2% PassDays
  9. set /a PassDays-=%DaysAgo%
  10. call :DaysToDate %PassDays% DstYear DstMonth DstDay
  11. set DstDate=%DstYear%-%DstMonth%-%DstDay%
  12. for /r "%SrcDir%" %%a in (*.*) do (
  13.   if "%%~ta" leq "%DstDate%" (
  14.     if exist "%%a" (
  15.       echo del /f /q "%%a"
  16.     )
  17.   )
  18. )
  19. pause
  20. goto :eof
  21. :DateToDays %yy% %mm% %dd% days
  22. setlocal ENABLEEXTENSIONS
  23. set yy=%1&set mm=%2&set dd=%3
  24. if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
  25. set /a dd=100%dd%%%100,mm=100%mm%%%100
  26. set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
  27. set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
  28. endlocal&set %4=%j%&goto :EOF
  29. :DaysToDate %days% yy mm dd
  30. setlocal ENABLEEXTENSIONS
  31. set /a a=%1+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
  32. set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
  33. set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
  34. (if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
  35. endlocal&set %2=%yy%&set %3=%mm%&set %4=%dd%&goto :EOF
复制代码

作者: xiongmao    时间: 2009-7-13 09:53

你好 楼主 还是这个情况(if "09-07-12 04:04 " LEQ "2009-07-10"
并且不该删除的文件 提示也有删除
作者: xiongmao    时间: 2009-7-13 10:06

运行显示如下,制定三天前的,但是今天的文件也提示将被删除


E:\>rem 指定待删除文件的存放路径

E:\>set SrcDir=e:\crm

E:\>rem 指定天数

E:\>set DaysAgo=3

E:\>rem 假设日期格式为:星期一 2009-07-13

E:\>call ateToDays 2009 07 13 PassDays

E:\>setlocal ENABLEEXTENSIONS

E:\>set yy=2009  & set mm=07  & set dd=13

E:\>if 12009 LSS 200 if 12009 LSS 170 (set yy=202009 )  else (set yy=192009 )

E:\>set /a dd=10013%100,mm=10007%100

E:\>set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2

E:\>set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633

E:\>endlocal & set PassDays=14438  & goto :EOF

E:\>set /a PassDays-=3

E:\>call :DaysToDate 14435 DstYear DstMonth DstDay

E:\>setlocal ENABLEEXTENSIONS

E:\>set /a a=14435+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a

E:\>set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5

E:\>set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10

E:\>(if 7 LSS 10 set mm=07 )  & (if 10 LSS 10 set dd=010 )

E:\>endlocal & set DstYear=2009  & set DstMonth=07  & set DstDay=10  & goto :EOF


E:\>set DstDate=2009-07-10

E:\>for /R "e:\crm" %a in (*.*) do (if "%~ta" LEQ "2009-07-10" (if exist "%a" (e
cho del /f /q "%a" ) ) )

E:\>(if "08-10-30 08:21 " LEQ "2009-07-10" (if exist "e:\crm\20081030082017hjfor
est@技术规范确认书及项目明细.xls" (echo del /f /q "e:\crm\20081030082017hjforest
@技术规范确认书及项目明细.xls" ) ) )
del /f /q "e:\crm\20081030082017hjforest@技术规范确认书及项目明细.xls"

E:\>(if "08-10-30 08:27 " LEQ "2009-07-10" (if exist "e:\crm\20081030082615hjfor
est@华俊和集团车型对照表.xls" (echo del /f /q "e:\crm\20081030082615hjforest@华
俊和集团车型对照表.xls" ) ) )
del /f /q "e:\crm\20081030082615hjforest@华俊和集团车型对照表.xls"

E:\>(if "08-10-30 08:41 " LEQ "2009-07-10" (if exist "e:\crm\20081030083809hjlll
@营销服务部各岗位人员信息表.doc" (echo del /f /q "e:\crm\20081030083809hjlll@营
销服务部各岗位人员信息表.doc" ) ) )
del /f /q "e:\crm\20081030083809hjlll@营销服务部各岗位人员信息表.doc"

E:\>(if "09-07-12 04:04 " LEQ "2009-07-10" (if exist "e:\crm\mycrm50200907120400
00.bak" (echo del /f /q "e:\crm\mycrm5020090712040000.bak" ) ) )
del /f /q "e:\crm\mycrm5020090712040000.bak"

E:\>(if "09-07-13 04:04 " LEQ "2009-07-10" (if exist "e:\crm\mycrm50200907130400
00.bak" (echo del /f /q "e:\crm\mycrm5020090713040000.bak" ) ) )
del /f /q "e:\crm\mycrm5020090713040000.bak"

E:\>(if "09-07-11 14:46 " LEQ "2009-07-10" (if exist "e:\crm\新建 WPS演示 演示文
稿.dps" (echo del /f /q "e:\crm\新建 WPS演示 演示文稿.dps" ) ) )
del /f /q "e:\crm\新建 WPS演示 演示文稿.dps"

E:\>pause
请按任意键继续 . . .
作者: Batcher    时间: 2009-7-13 12:41     标题: 回复 22楼 的帖子

能否把以下注册表分支导出来,传到论坛上来看看:
HKEY_CURRENT_USER\Control Panel\International\
作者: xiongmao    时间: 2009-7-13 14:32

截图如下两图片
作者: Batcher    时间: 2009-7-13 22:10     标题: 回复 25楼 的帖子

dir命令的结果如何呢?

C:\Test>dir
驱动器 C 中的卷没有标签。
卷的序列号是 9033-65A2

C:\Test 的目录

2009-07-06  21:13    <DIR>          .
2009-07-06  21:13    <DIR>          ..
2009-07-06  21:21                11 test.bat
2009-07-06  21:03                 0 新建 文本文档.tx.jpg
2009-07-06  21:03                 0 新建 文本文档.txt.jpg
               3 个文件             11 字节
               2 个目录 15,391,432,704 可用字节


把sShortDate改成yyyy-M-d再试试?
作者: kingwu    时间: 2009-8-12 18:41

请教下LZ,能不能按小时来删除呢
在线等,谢谢先了
作者: Batcher    时间: 2009-8-12 21:25     标题: 回复 27楼 的帖子

小时的计算跟天数的计算非常类似,可以参照方案二的思路,调用 Ritchie Lawrence 批处理函数库中的代码:
http://bbs.bathome.net/thread-3056-1-1.html
作者: kingwu    时间: 2009-8-12 22:22

先谢过了



call ateToDays %date:~0,4% %date:~5,2% %date:~8,2% PassDays

:DateToDays %yy% %mm% %dd% days
setlocal ENABLEEXTENSIONS
set yy=%1&set mm=%2&set dd=%3
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
endlocal&set %4=%j%&goto :EOF

%date:~0,4% %date:~5,2% %date:~8,2%  它是根据什么结论获取来的,另reg里面的内容格式是否会有变动?(小时制,目前只能用分钟替代小时)  另如果分钟的时间太长 会不会出现时间差呢?

[ 本帖最后由 kingwu 于 2009-8-12 22:51 编辑 ]
作者: Batcher    时间: 2009-8-13 20:56     标题: 回复 29楼 的帖子

根据系统日期格式为yyyy-mm-dd来获取
有可能
不会
作者: kingwu    时间: 2009-8-13 21:41

感谢版主的回复
根据系统日期格式为yyyy-mm-dd来获取  这个我明白
我说的是%date:~0,4% %date:~5,2% %date:~8,2%

其中的:~0,4% ~5,2% ~8,2%  这个数据是根据什么换算的  
因为我是日期换分钟  理论上应该是yyyy-mm-dd-hh-mm 要不我不知道含义没法换算后面的
作者: Batcher    时间: 2009-8-13 23:15     标题: 回复 31楼 的帖子

这个只是字符串的截取而已,yyyy-mm-dd字符串长度为十,偏移量从零开始计算。
%date:~0,4%类似于其它语言中的函数substring(),意思是从第零位开始截取,共截取4位,这样就把年的值取到了。
作者: kingwu    时间: 2009-8-14 13:20

代码更新 在楼下

[ 本帖最后由 kingwu 于 2009-8-19 18:59 编辑 ]
作者: kingwu    时间: 2009-8-16 22:45

麻烦 版主有时间帮忙看看 好吗?
作者: Batcher    时间: 2009-8-19 23:04     标题: 回复 34楼 的帖子

既然你已经另开了一个帖子,我们就到那个帖子里面去讨论吧^_^
http://bbs.bathome.net/thread-5648-1-1.html
作者: kulahun    时间: 2009-11-5 14:20

东西真好,好好学习了
作者: Batcher    时间: 2009-11-5 20:04

老大,http://bbs.bathome.net/thread-3334-1-1.html上方案一,里面删除的文件是目录中日期满足条件全部的文件,如果我只是要限制删除满足日期条件的某个类型的文件,要怎么改呢?比如就删除.bak,其它格式的不动,谢谢啦

把*.*改成*.bak
作者: baixfps    时间: 2010-1-19 01:41

本人绝对新手。。现在只回贴,日后再交流!谢谢各大虾!
作者: buybuybuy    时间: 2010-5-15 11:52

我按照楼主的方案三在win2000系统中测试
发现会把修改日期是今天的文件都删除掉,我是有指定了两天的
发现是没有判断日期的
作者: Batcher    时间: 2010-5-15 12:06     标题: 回复 39楼 的帖子

把代码保存为C:\test.bat
把@echo off删除
开始
运行
cmd
C:\test.bat
把完整的执行过程贴出来看看


Q: 怎样把CMD窗口里的结果复制出来?

A: 右键单击CMD窗口的标题栏→“属性”→“选项”→勾选"快速编辑模式”→然后在CMD窗口用鼠标左键选中想要拷贝的内容→在选中的内容上单击鼠标右键→粘贴到文本文件中即可
作者: buybuybuy    时间: 2010-5-15 15:21

原帖由 Batcher 于 2010-5-15 12:06 发表
把代码保存为C:\test.bat
把@echo off删除
开始
运行
cmd
C:\test.bat
把完整的执行过程贴出来看看


Q: 怎样把CMD窗口里的结果复制出来?

A: 右键单击CMD窗口的标题栏→“属性”→“选项”→勾选"快速编 ...


请见附件,显示把15号的数据也删除!
作者: Batcher    时间: 2010-5-15 17:11     标题: 回复 41楼 的帖子

是系统日期格式的问题
开始
运行
cmd
reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate
dir "C:\Documents and Settings\Administrator\桌面\20080624_133636"
结果贴出来看看
作者: buybuybuy    时间: 2010-5-15 17:26     标题: 回复 42楼 的帖子

因为是2000系统所以不能运行REG
我运行打开注册表给你看看吧 ,请看图
作者: Batcher    时间: 2010-5-15 17:38     标题: 回复 43楼 的帖子

开始
运行
cmd
for  %a in ("C:\Documents and Settings\Administrator\桌面\20080624_133636\34") do @echo %~ta
结果如何?
作者: buybuybuy    时间: 2010-5-17 08:52     标题: 回复 44楼 的帖子

10-05-15 11:24
作者: buybuybuy    时间: 2010-5-18 10:18     标题: 回复 44楼 的帖子

结果为 :10-05-15 11:24  有问题吗?
作者: buybuybuy    时间: 2010-5-26 17:37

TO Batcher 大大 麻烦看看啊 谢谢了!
作者: Batcher    时间: 2010-5-26 21:08     标题: 回复 46楼 的帖子

你的系统里面%%~ta获得的日期只有两位年份,导致日期比较出错。
试试方案五吧。

我现在没有你那样的环境,不方便做测试,你可以自己试试如何修改注册表键值可以让它获得四位的年份。
HKEY_CURRENT_USER\Control Panel\International
作者: buybuybuy    时间: 2010-6-8 15:50

原帖由 Batcher 于 2010-5-26 21:08 发表
你的系统里面%%~ta获得的日期只有两位年份,导致日期比较出错。
试试方案五吧。

我现在没有你那样的环境,不方便做测试,你可以自己试试如何修改注册表键值可以让它获得四位的年份。
HKEY_CURRENT_USER\Control ...


多谢回复
我从2003的系统拷贝forfiles到2K系统下是不能运行,在XP系统下就可以使用

另外 HKEY_CURRENT_USER\Control Panel\International 中
我看到时间格式:yyyy-MM-dd
作者: buybuybuy    时间: 2010-7-12 15:50

TO  Batcher
有其他的方案提供吗?环境为2000系统
作者: cuipengfei    时间: 2010-10-12 13:16

不行啊! 我试了, 只是弹出“请按任意键继续”
上面的代码都试了一遍了!
作者: cuipengfei    时间: 2010-10-12 13:17

然后窗口就消失了! 沮丧!
作者: toncoolove    时间: 2011-11-28 12:08

回复 1# Batcher


    楼主你好!
    我用了你的方案五, 最近业务增加的一点要求,  之前设置是删除五天之前的备份文件, set DaysAgo=5,  现在需求是, 每月1号和15号的备份文件不删除.
   
    文件格式为"abc_2011-11-28_.rar".

    我的思路有两个:
    1.还是从文件修改日期入手, 根据判断该文件的修改时间进行删除.

    2.从文件名的固定格式入手,  例如, 包含 "-1_" 或者 "-15_" 这两种字符时, 不进行删除.

    请教楼主, 怎么修改方案五能比较简单的完成上诉的需求呢? 如果不能, 我参考方案几呢?
    本人是批处理脚本的菜鸟, 期待楼主的宝贵答案,谢谢!
作者: Batcher    时间: 2011-11-28 13:29

回复 53# toncoolove


请参考方案六
作者: Batcher    时间: 2011-11-28 13:30

回复 51# cuipengfei


不是不行,是你还没有学会怎样使用。
作者: toncoolove    时间: 2011-11-28 15:46

本帖最后由 toncoolove 于 2011-11-28 15:52 编辑

回复 54# Batcher


    楼主,谢谢你的方案六, 我测试了一下, 发现:
    if "!FileDate!" leq "%DstDate%"  这句
  若 "!FileDate!"  值是 2011-11-3 ,  "%DstDate%" 的值是 2011-11-23 时,   判断的结果为true,  命令把判断为 2011-11-3 比 2011-11-23 大,
   由于我的文件名生成的问题, 应该生成2011-11-03, 所以引起以上问题, 谢谢你!
作者: Batcher    时间: 2011-11-28 16:12

回复 56# toncoolove


系统日期格式是由一个注册表键值决定的,你可以选择一个合适的解决方法:
方法1:修改注册表键值
方法2:自己在月份和日期前面补0
作者: Batcher    时间: 2011-12-5 20:39

回复 58# botey


批处理删除指定天数日期之前的文件夹
http://www.bathome.net/thread-3503-1-1.html
作者: tianshiguodong    时间: 2011-12-23 20:27

回复 1# Batcher


    楼主大人,你好!
    我想删除n天之前的文件(使用文件中包含的日期判断)
    我的文件为固定格式IN931.yyyy.mm.dd.*                ------其中*表示固定长度的数字序号
    请教该如何修改方案六实现此功能,望赐教
作者: clonecd    时间: 2012-5-20 13:06

超强悍好用,不过我需要慢慢消化一下。
作者: 喃喃努努    时间: 2012-8-30 09:02

求楼主帮忙啊,这篇贴太棒了,对我太有用了,但是我在NT系统里面试了一下运行不成功,经过仔细排查后,我发现是
  1. for /r "%SrcDir%" %%a in (*.*) do (
  2.     if "%%~ta" leq "%DstDate%" (
  3.         if exist "%%a" (
  4.             echo del /f /q "%%a"
  5.         )
  6.     )
  7. )
复制代码
这句有问题,在NT系统的for命令下面没有"%%~ta"取时间的命令,因此我另寻他法
  1. for /f "skip=3 tokens=1,3,*" %%a in ('dir %SrcDir%\*.* /tw /od') do (
  2.     if %%a leq %DstDate% (
  3.            del /f /q "%SrcDir%\%%c"
  4.     )
  5. )
复制代码
在XP系统下面运行正常,但是到NT系统下面就不能正常运行,也找不到原因,请大家给帮忙找找原因,谢谢~~~~~
作者: fatcat    时间: 2012-8-30 10:57

回复 62# 喃喃努努

建议你从 dir 的输出格式 和 nt 下日期的输出格式(dir) 和 DstDate 的格式是否一致来排查
作者: 喃喃努努    时间: 2012-8-30 11:03

回复  喃喃努努

建议你从 dir 的输出格式 和 nt 下日期的输出格式(dir) 和 DstDate 的格式是否一致来排 ...
fatcat 发表于 2012-8-30 10:57



    谢谢,我去看一下。
作者: 喃喃努努    时间: 2012-8-30 15:43

回复  喃喃努努

建议你从 dir 的输出格式 和 nt 下日期的输出格式(dir) 和 DstDate 的格式是否一致来排 ...
fatcat 发表于 2012-8-30 10:57



    确实日期格式有问题,我应该如何改呢?NT系统下面dir 输出文件的日期格式为mm/dd/yy,而DstDate为yyyy-mm-dd.
作者: forfiles    时间: 2012-8-30 15:58

回复 65# 喃喃努努
  1. set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%
复制代码
修改这一句
作者: 喃喃努努    时间: 2012-8-30 17:05

回复  喃喃努努 修改这一句
forfiles 发表于 2012-8-30 15:58


谢谢了,但是还有问题,
  1. echo  %DstDate%
  2. pause
  3. for /f "skip=3 tokens=1,3,*" %%a in ('dir %SrcDir%\*.* /tw /od') do (
  4.           echo del /f /q %%a  %SrcDir%\%%c
  5. )
  6. pause
  7. for /f "skip=3 tokens=1,3,*" %%a in ('dir %SrcDir%\*.* /tw /od') do (
  8.     if "%%a" leq "%DstDate%" (
  9.           echo del /f /q %SrcDir%\%%c
  10.     )
  11. )
  12. pause
复制代码
运行前两步都行,但是第三步还是不行,貌似还是不能比较的情况, if "%%a" leq "%DstDate%"这个里面变量加引号和不加引号都不行。
作者: forfiles    时间: 2012-8-30 17:35

回复 67# 喃喃努努


    这样直接比较确实有问题。你试试顶楼的reg add命令修改注册表之后,看看dir命令的显示结果能否改成yyyy-mm-dd
作者: 喃喃努努    时间: 2012-8-31 08:26

回复 68# forfiles


不行啊,reg好像在NT系统里面用不了。只能找其他出路了。
作者: 喃喃努努    时间: 2012-8-31 08:32

回复 68# forfiles


这个是NT的注册表里面的,好像时间格式和我们需要的yyyy-M-d一样,但是用dir显示出来的为什么还是m/d/yy,搞不懂。
作者: 喃喃努努    时间: 2012-8-31 16:11

回复 68# forfiles


    突然发现可以NT系统可以if判断比较,也可以for循环,但是两个不能嵌套,嵌套在一起的话不运行直接跳过,也不报错,不知道什么情况。
作者: forfiles    时间: 2012-9-1 12:15

回复 71# 喃喃努努


把你的完整代码贴出来我看看
还有就是把@echo off删掉执行一遍把过程贴出来
作者: 喃喃努努    时间: 2012-9-3 14:09

回复 72# forfiles
  1. set SrcDir=D:\temp1
  2. set DaysAgo=1
  3. >"%temp%\BackupDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")
  4. >>"%temp%\BackupDate.vbs" echo WScript.Echo WshShell.RegRead ("HKEY_CURRENT_USER\Control
  5. Panel\International\sShortDate")
  6. for /f %%a in ('cscript /nologo "%temp%\BackupDate.vbs"') do (
  7.     set "RegDateOld=%%a"
  8. )
  9. pause
  10. >"%temp%\UnifyDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")
  11. >>"%temp%\UnifyDate.vbs" echo WshShell.RegWrite "HKEY_CURRENT_USER\Control
  12. Panel\International\sShortDate", "yyyy-M-d", "REG_SZ"
  13. cscript /nologo "%temp%\UnifyDate.vbs"
  14. >"%temp%\DstDate.vbs" echo LastDate=date()-%DaysAgo%
  15. >>"%temp%\DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^&
  16. month(LastDate),2) ^& right("0" ^& day(LastDate),2)
  17. >>"%temp%\DstDate.vbs" echo wscript.echo FmtDate
  18. for /f %%a in ('cscript /nologo "%temp%\DstDate.vbs"') do (
  19.     set "DstDate=%%a"
  20. )
  21. set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%
  22. pause
  23. dir %SrcDir%\*.* /tw /od /tw
  24. pause
  25. for /f "skip=3 tokens=1,3,*" %%a in ('dir %SrcDir%\*.* /tw /od') do (echo %%a %%c)
  26. pause
  27. if "1" LEQ "2" echo  del /f /q 123
  28. if "3" LEQ "2" echo  del /f /q 456
  29. pause
  30. for /f "skip=3 tokens=1,3,*" %%a in ('dir %SrcDir%\*.* /tw /od') do (
  31.     if "1" LEQ "2" (
  32.           echo  %%a %%c
  33.     )
  34. )
  35. pause
  36. >"%temp%\RecoverDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")
  37. >>"%temp%\RecoverDate.vbs" echo WshShell.RegWrite "HKEY_CURRENT_USER\Control
  38. Panel\International\sShortDate", "%RegDateOld%", "REG_SZ"
  39. cscript /nologo "%temp%\RecoverDate.vbs"
  40. pause
复制代码

作者: 喃喃努努    时间: 2012-9-3 15:12

回复 72# forfiles


D:\WINNT\Profiles\ASEKS\Desktop>set SrcDir=D:\temp1

D:\WINNT\Profiles\ASEKS\Desktop>set DaysAgo=1

D:\WINNT\Profiles\ASEKS\Desktop>echo Set WshShell = WScript.CreateObject("WScript.Shell"
) 1>"D:\TEMP\BackupDate.vbs"

D:\WINNT\Profiles\ASEKS\Desktop>echo WScript.Echo WshShell.RegRead ("HKEY_CURRENT_USER\C
ontrol Panel\International\sShortDate") 1>>"D:\TEMP\BackupDate.vbs"

D:\WINNT\Profiles\ASEKS\Desktop>FOR /F %a in ('cscript /nologo "D:\TEMP\BackupDate.vbs"'
) do (set "RegDateOld=%a" )

D:\WINNT\Profiles\ASEKS\Desktop>(set "RegDateOld=yyyy-M-d" )

D:\WINNT\Profiles\ASEKS\Desktop>pause
Press any key to continue . . .

D:\WINNT\Profiles\ASEKS\Desktop>echo Set WshShell = WScript.CreateObject("WScript.Shell"
) 1>"D:\TEMP\UnifyDate.vbs"

D:\WINNT\Profiles\ASEKS\Desktop>echo WshShell.RegWrite "HKEY_CURRENT_USER\Control Panel\
International\sShortDate", "yyyy-M-d", "REG_SZ" 1>>"D:\TEMP\UnifyDate.vbs"

D:\WINNT\Profiles\ASEKS\Desktop>cscript /nologo "D:\TEMP\UnifyDate.vbs"

D:\WINNT\Profiles\ASEKS\Desktop>echo LastDate=date()-1 1>"D:\TEMP\DstDate.vbs"

D:\WINNT\Profiles\ASEKS\Desktop>echo FmtDate=right(year(LastDate),4) & right("0" & month
(LastDate),2) & right("0" & day(LastDate),2) 1>>"D:\TEMP\DstDate.vbs"

D:\WINNT\Profiles\ASEKS\Desktop>echo wscript.echo FmtDate 1>>"D:\TEMP\DstDate.vbs"

D:\WINNT\Profiles\ASEKS\Desktop>FOR /F %a in ('cscript /nologo "D:\TEMP\DstDate.vbs"') d
o (set "DstDate=%a" )

D:\WINNT\Profiles\ASEKS\Desktop>(set "DstDate=20120902" )

D:\WINNT\Profiles\ASEKS\Desktop>set DstDate=2012-09-02

D:\WINNT\Profiles\ASEKS\Desktop>pause
Press any key to continue . . .
D:\WINNT\Profiles\ASEKS\Desktop>dir D:\temp1\*.* /tw /od /tw
Volume in drive D is WINNT
Volume Serial Number is 642B-B607

Directory of D:\temp1

08/28/12  04:24p                32,700 fldb1897
08/29/12  03:40p                32,704 fldb1898
08/31/12  02:42a                54,117 fldb1913
09/01/12  01:26a                54,121 fldb1916
09/03/12  01:26p                     0 TEST.txt
09/03/12  01:26p        <DIR>          ..
09/03/12  01:26p        <DIR>          .
               7 File(s)        173,642 bytes
                          1,073,503,744 bytes free

D:\WINNT\Profiles\ASEKS\Desktop>pause
Press any key to continue . . .

D:\WINNT\Profiles\ASEKS\Desktop>FOR /F "skip=3 tokens=1,3,*" %a in ('dir D:\temp1\*.* /t
w /od') do (echo %a %c )

D:\WINNT\Profiles\ASEKS\Desktop>(echo Directory  )
Directory

D:\WINNT\Profiles\ASEKS\Desktop>(echo 08/28/12 fldb1897 )
08/28/12 fldb1897

D:\WINNT\Profiles\ASEKS\Desktop>(echo 08/29/12 fldb1898 )
08/29/12 fldb1898

D:\WINNT\Profiles\ASEKS\Desktop>(echo 08/31/12 fldb1913 )
08/31/12 fldb1913

D:\WINNT\Profiles\ASEKS\Desktop>(echo 09/01/12 fldb1916 )
09/01/12 fldb1916

D:\WINNT\Profiles\ASEKS\Desktop>(echo 09/03/12 TEST.txt )
09/03/12 TEST.txt

D:\WINNT\Profiles\ASEKS\Desktop>(echo 09/03/12 .. )
09/03/12 ..

D:\WINNT\Profiles\ASEKS\Desktop>(echo 09/03/12 . )
09/03/12 .

D:\WINNT\Profiles\ASEKS\Desktop>(echo 7 bytes )
7 bytes

D:\WINNT\Profiles\ASEKS\Desktop>(echo 1,073,503,744  )
1,073,503,744

D:\WINNT\Profiles\ASEKS\Desktop>pause
Press any key to continue . . .

D:\WINNT\Profiles\ASEKS\Desktop>if "1" LEQ "2" echo  del /f /q 123
del /f /q 123

D:\WINNT\Profiles\ASEKS\Desktop>if "3" LEQ "2" echo  del /f /q 456

D:\WINNT\Profiles\ASEKS\Desktop>pause
Press any key to continue . . .

D:\WINNT\Profiles\ASEKS\Desktop>FOR /F "skip=3 tokens=1,3,*" %a in ('dir D:\temp1\*.* /t
w /od') do (if "1" LEQ "2" (echo  %a %c ) )

D:\WINNT\Profiles\ASEKS\Desktop>pause
Press any key to continue . . .

D:\WINNT\Profiles\ASEKS\Desktop>echo Set WshShell = WScript.CreateObject("WScript.Shell"
) 1>"D:\TEMP\RecoverDate.vbs"

D:\WINNT\Profiles\ASEKS\Desktop>echo WshShell.RegWrite "HKEY_CURRENT_USER\Control Panel\
International\sShortDate", "yyyy-M-d", "REG_SZ" 1>>"D:\TEMP\RecoverDate.vbs"

D:\WINNT\Profiles\ASEKS\Desktop>cscript /nologo "D:\TEMP\RecoverDate.vbs"

D:\WINNT\Profiles\ASEKS\Desktop>pause
Press any key to continue . . .
作者: 喃喃努努    时间: 2012-9-3 15:22

回复 72# forfiles


    我这里没有做实际的时间比较,因为时间格式还没有统一,所以你先帮我看看为什么for和if嵌套不行,也没报错,只是没有运行结果;for单独运行可以,if单独运行也可以,就是for和if 嵌套没有运行结果。
作者: forfiles    时间: 2012-9-5 07:31

回复 75# 喃喃努努


我在Win7里面测试了一下没有问题:
  1. set SrcDir=D:\temp1
  2. for /f "skip=3 tokens=1,3,*" %%a in ('dir %SrcDir%\*.* /tw /od') do (
  3.     if "1" LEQ "2" (
  4.         echo right %%a %%c
  5.     ) else (
  6.         echo wrong %%a %%c
  7.     )
  8. )
  9. pause
复制代码

作者: 喃喃努努    时间: 2012-9-5 08:49

回复 76# forfiles


    谢谢,在xp运行也是ok的,就是NT系统不能嵌套,郁闷。
作者: forfiles    时间: 2012-9-5 15:16

回复 77# 喃喃努努


    我手上没有NT系统,无法测试。
作者: 喃喃努努    时间: 2012-9-6 09:08

回复 78# forfiles


    还是十分感谢。
作者: web    时间: 2012-10-16 21:25

系统时间回到了 2002.1.1   电池坏了
作者: 一坑坑兔一    时间: 2012-11-22 14:04

大神,还在吗?看了你的批处理的帖子收获很大,我想问一下,我现在想做一个删除7天之前的指定路径下的文件夹的bat文件,详细代码应该怎么写?http://bbs.bathome.net/thread-3334-1-1.html这个帖子里都是删除文件的,在线等,急用,谢谢。系统是xp,最好做一个通用的。win7—xp
作者: Batcher    时间: 2012-11-24 16:19

回复 81# 一坑坑兔一


    把*.*改成*.bat
作者: wwnjwd    时间: 2012-12-28 22:10

太厉害了!
我需要一个能删除指定目录(包括子目录)下特定日期文件的批处理,和帖子里的批处理相比,多了递归子目录文件的需求。请版主劳神写一个。谢谢了!
作者: Batcher    时间: 2012-12-28 23:37

回复 83# wwnjwd


    代码里面的for /r本身就有递归子目录的功能
作者: wwnjwd    时间: 2012-12-29 09:49

回复  wwnjwd


    代码里面的for /r本身就有递归子目录的功能
Batcher 发表于 2012-12-28 23:37


谢谢版主!
作者: stefanlian    时间: 2013-6-15 09:36

LZ帮大忙了,从这一刻起开始学习批处理。受教了
作者: 857878718    时间: 2013-11-21 18:22

我想问一下 【方案六】删除指定路径下指定天数之前(以文件名中包含的日期字符串为准)的文件 如果目录中还有其他文件 如 aa-2010-10-11.txt   aaaaaa-2010-10-11.txt  还有 a.txt 现在只想删除aa-2010-10-11.txt  请问大神如何解决?
作者: CGQNET    时间: 2015-3-28 22:41

Batcher楼主,好厉害的高手,小弟在此谢了!
作者: fsxt    时间: 2015-6-17 11:18

这个要反复测试的!!!!
作者: ai_hinemon    时间: 2016-2-14 16:17

回复 15# qq43142691


    您好 楼主
我想请教个问题;
http://www.bathome.net/thread-3334-1-1.html 此贴中的方案2;
这里只删除该文件夹下的文件,如果该文件夹下包括很多子目录且需删除子目录文件夹呢?在删除的时候窗口能同时显示正在删除的文件吗?
怎么完善,忘释惑!十分感谢
作者: y185130162    时间: 2016-4-11 17:50

使用的方案4,一直用在server2003上没有问题,删除的是3天前的文件,但是迁移到server2008上以后,就把文件夹下的所有文件都删除了
作者: 包乐鱼    时间: 2016-4-12 20:38

不错  学些 知识
作者: fsxt    时间: 2017-5-25 11:16

感谢分享!!!
作者: hwhtj    时间: 2018-7-5 16:38

不是有一个forfile吗?用得着这么复杂?
作者: Batcher    时间: 2018-7-5 17:18

回复 93# hwhtj


    嗯,【方案3】就是forfiles
作者: szl1123    时间: 2019-7-23 20:56

非常有用,谢谢。
作者: 170503289    时间: 2021-9-15 22:36

如何将删除的时间依照文件夹的创建时间来判断删除时间,




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