标题: [日期时间] 批处理删除指定天数日期之前的文件(2023-10-08) [打印本页]
作者: Batcher 时间: 2009-2-14 03:32 标题: 批处理删除指定天数日期之前的文件(2023-10-08)
【方案1】以文件的最后修改时间为准 BAT + PowerShell- @echo off
- REM ------------------------------------------------------------------------------
- REM 如果显示的待删除文件列表正确无误
- REM 把 Select-Object FullName 修改成 Remove-Item -Force 再次执行即可真正删除文件
- REM Win7/Win8/Win10等系统自带PowerShell
- REM ------------------------------------------------------------------------------
-
- REM 指定待删除文件的存放路径
- set "SrcDir=C:\Test\BatHome"
- REM 指定天数
- set "DaysAgo=10"
-
- 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"
-
- pause
复制代码
【方案2】以文件的创建时间为准 BAT + PowerShell- @echo off
- REM ------------------------------------------------------------------------------
- REM 如果显示的待删除文件列表正确无误
- REM 把 Select-Object FullName 修改成 Remove-Item -Force 再次执行即可真正删除文件
- REM Win7/Win8/Win10等系统自带PowerShell
- REM ------------------------------------------------------------------------------
-
- REM 指定待删除文件的存放路径
- set "SrcDir=C:\Test\BatHome"
- REM 指定天数
- set "DaysAgo=10"
-
- 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"
-
- pause
复制代码
【方案3-1】以文件的修改日期为准 forfiles- @echo off
- REM ------------------------------------------------------------------------------
- REM 演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件。
- REM 如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
- REM Win7/Win8/Win10等系统自带forfiles命令
- REM ------------------------------------------------------------------------------
-
- REM 指定待删除文件的存放路径
- set "SrcDir=C:\Test\BatHome"
- REM 指定天数
- set "DaysAgo=1"
-
- forfiles /p %SrcDir% /s /m *.* /d -%DaysAgo% /c "cmd /c echo del /f /q /a @path"
- pause
复制代码
【方案3-2】forfiles 删除指定日期之前的txt文件,且排除指定文件名的某个文件:- @echo off
- REM ------------------------------------------------------------------------------
- REM 演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件。
- REM 如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
- REM Win7/Win8/Win10等系统自带forfiles命令
- REM ------------------------------------------------------------------------------
-
- REM 指定待删除文件的存放路径
- set "SrcDir=C:\Test\BatHome"
- REM 指定天数
- set "DaysAgo=3"
- REM 指定排除的文件名
- set "ExcludeFile=BatHome.txt"
-
- for /f "delims=" %%i in ('forfiles /p %SrcDir% /s /m *.txt /d -%DaysAgo% /c "cmd /c echo @path"') do (
- if "%%~nxi" neq "%ExcludeFile%" (
- echo del /f /q "%%i"
- )
- )
-
- pause
复制代码
【方案4】以文件的最后修改时间为准 BAT + REG + VBS- @echo off
- REM ------------------------------------------------------------------------------
- REM 演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件。
- REM 如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
- REM 本例调用了临时VBS代码进行日期计算
- REM 本例为兼容不同的日期格式,调用reg命令(XP系统自带)统一设置日期格式,
- REM 处理完毕之后再把日期格式恢复成原来的状态。
- REM ------------------------------------------------------------------------------
-
- REM 指定待删除文件的存放路径
- set "SrcDir=C:\Test\BatHome"
- REM 指定天数
- set "DaysAgo=1"
-
- for /f "delims=" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (
- set "RegDateOld=%%a"
- )
- set RegDateOld=%RegDateOld:~-8%
- reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul
- >"%temp%\DstDate.vbs" echo LastDate=date()-%DaysAgo%
- >>"%temp%\DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)
- >>"%temp%\DstDate.vbs" echo wscript.echo FmtDate
- for /f %%a in ('cscript /nologo "%temp%\DstDate.vbs"') do (
- set "DstDate=%%a"
- )
- set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%
- for /r "%SrcDir%" %%a in (*.*) do (
- if "%%~ta" leq "%DstDate%" (
- if exist "%%a" (
- echo del /f /q "%%a"
- )
- )
- )
- reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul
- pause
复制代码
【方案5】以文件的最后修改时间为准 BAT + REG + Ritchie Lawrence 日期函数- @echo off
- REM ------------------------------------------------------------------------------
- REM 演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件。
- REM 如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
- REM 本例调用了 Ritchie Lawrence 的日期函数进行日期计算
- REM 日期转换的核心算法请参考http://bbs.bathome.cn/thread-3056-1-1.html
- REM 本例为兼容不同的日期格式,调用reg命令(XP系统自带)统一设置日期格式,
- REM 处理完毕之后再把日期格式恢复成原来的状态。
- REM ------------------------------------------------------------------------------
-
- REM 指定待删除文件的存放路径
- set "SrcDir=C:\Test\BatHome"
- REM 指定天数
- set "DaysAgo=1"
-
- for /f "delims=" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (
- set "RegDateOld=%%a"
- )
- set RegDateOld=%RegDateOld:~-8%
- reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul
- call :DateToDays %date:~0,4% %date:~5,2% %date:~8,2% PassDays
- reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul
- set /a PassDays-=%DaysAgo%
- call :DaysToDate %PassDays% DstYear DstMonth DstDay
- set DstDate=%DstYear%-%DstMonth%-%DstDay%
- for /r "%SrcDir%" %%a in (*.*) do (
- if "%%~ta" leq "%DstDate%" (
- if exist "%%a" (
- echo del /f /q "%%a"
- )
- )
- )
- reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul
- 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
复制代码
【方案6】以文件的最后修改时间为准 BAT + VBS- @echo off
- REM ------------------------------------------------------------------------------
- REM 演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件。
- REM 如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
- REM 本例调用了临时VBS代码进行日期计算,并统一设置系统日期格式,处理完毕
- REM 之后再把日期格式恢复成原来的状态。摆脱了对reg命令(XP系统自带)的依赖。
- REM ------------------------------------------------------------------------------
-
- REM 指定待删除文件的存放路径
- set "SrcDir=C:\Test\BatHome"
- REM 指定天数
- set "DaysAgo=1"
-
- >"%temp%\BackupDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")
- >>"%temp%\BackupDate.vbs" echo WScript.Echo WshShell.RegRead ("HKEY_CURRENT_USER\Control Panel\International\sShortDate")
- for /f %%a in ('cscript /nologo "%temp%\BackupDate.vbs"') do (
- set "RegDateOld=%%a"
- )
- >"%temp%\UnifyDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")
- >>"%temp%\UnifyDate.vbs" echo WshShell.RegWrite "HKEY_CURRENT_USER\Control Panel\International\sShortDate", "yyyy-M-d", "REG_SZ"
- cscript /nologo "%temp%\UnifyDate.vbs"
- >"%temp%\DstDate.vbs" echo LastDate=date()-%DaysAgo%
- >>"%temp%\DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)
- >>"%temp%\DstDate.vbs" echo wscript.echo FmtDate
- for /f %%a in ('cscript /nologo "%temp%\DstDate.vbs"') do (
- set "DstDate=%%a"
- )
- set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%
- for /r "%SrcDir%" %%a in (*.*) do (
- if "%%~ta" leq "%DstDate%" (
- if exist "%%a" (
- echo del /f /q "%%a"
- )
- )
- )
- >"%temp%\RecoverDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")
- >>"%temp%\RecoverDate.vbs" echo WshShell.RegWrite "HKEY_CURRENT_USER\Control Panel\International\sShortDate", "%RegDateOld%", "REG_SZ"
- cscript /nologo "%temp%\RecoverDate.vbs"
- pause
复制代码
【方案7】以文件的创建时间为准 BAT + REG + Ritchie Lawrence 日期函数- @echo off
- REM ------------------------------------------------------------------------------
- REM 演示:删除指定路径下指定天数之前(以文件的创建日期为准)的文件。
- REM 如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
- REM 本例调用了 Ritchie Lawrence 的日期函数进行日期计算
- REM 日期转换的核心算法请参考http://bbs.bathome.cn/thread-3056-1-1.html
- REM 本例为兼容不同的日期格式,调用reg命令(XP系统自带)统一设置日期格式,
- REM 处理完毕之后再把日期格式恢复成原来的状态。
- REM ------------------------------------------------------------------------------
-
- REM 指定待删除文件的存放路径
- set "SrcDir=C:\Test\BatHome"
- REM 指定天数
- set "DaysAgo=1"
-
- for /f "delims=" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (
- set "RegDateOld=%%a"
- )
- set RegDateOld=%RegDateOld:~-8%
- reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul
- call :DateToDays %date:~0,4% %date:~5,2% %date:~8,2% PassDays
- reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul
- set /a PassDays-=%DaysAgo%
- call :DaysToDate %PassDays% DstYear DstMonth DstDay
- set DstDate=%DstYear%-%DstMonth%-%DstDay%
-
- for /f "delims=/" %%a in ('dir /s /b /a-d "%SrcDir%"') do (
- call :CompareTime "%%a"
- )
- reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul
- 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
-
- :CompareTime
- for /f "skip=5 tokens=1-2 delims= " %%h in ('dir /a-d /tc %1') do (
- if "%%h" leq "%DstDate%" (
- if exist %1 (
- echo del /a /f /q %1
- )
- )
- goto :eof
- )
复制代码
【方案8】以文件名中包含的日期字符串为准 字符串截取- @echo off
- REM ------------------------------------------------------------------------------
- REM 演示:删除指定路径下指定天数之前(以文件名中包含的日期字符串为准)的文件。
- REM 如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
- REM 本例假设文件名中包含的日期字符串(比如:bak-2009-12-25.log)
- REM ------------------------------------------------------------------------------
-
- REM 指定待删除文件的存放路径
- set "SrcDir=C:\Test\BatHome"
- REM 指定天数
- set "DaysAgo=1"
-
- >"%temp%\DstDate.vbs" echo LastDate=date()-%DaysAgo%
- >>"%temp%\DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)
- >>"%temp%\DstDate.vbs" echo wscript.echo FmtDate
- for /f %%a in ('cscript /nologo "%temp%\DstDate.vbs"') do (
- set "DstDate=%%a"
- )
- set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%
-
- setlocal enabledelayedexpansion
- for /r "%SrcDir%" %%a in (*.*) do (
- set "FileDate=%%~na"
- set "FileDate=!FileDate:~4,10!"
- if "!FileDate!" leq "%DstDate%" (
- if exist "%%a" (
- echo del /f /q "%%a"
- )
- )
- )
- endlocal
- 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楼 的帖子
- @echo off
- ::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
- rem 指定待删除文件的存放路径
- set SrcDir=C:\Test
- rem 指定天数
- set DaysAgo=7
- rem 假设日期格式为:2009-06-12 星期五
- call :DateToDays %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
复制代码
作者: 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楼 的帖子
- @echo off
- ::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
- rem 指定待删除文件的存放路径
- set SrcDir=E:\123123
- rem 指定天数
- set DaysAgo=15
- rem 假设日期格式为:2009-06-12 星期五
- call :DateToDays %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
复制代码
作者: 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楼 的帖子
- @echo off
- ::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
- rem 指定待删除文件的存放路径
- set SrcDir=C:\Test\BatHome
- rem 指定天数
- set DaysAgo=1
- rem 假设日期格式为:星期一 2009-07-13
- call :DateToDays %date:~4,4% %date:~9,2% %date:~12,2% PassDays
- set /a PassDays-=%DaysAgo%
- call :DaysToDate %PassDays% DstYear DstMonth DstDay
- set DstDate=%DstYear%-%DstMonth%-%DstDay%
- for /r "%SrcDir%" %%a in (*.*) do (
- if "%%~ta" leq "%DstDate%" (
- if exist "%%a" (
- echo del /f /q "%%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
复制代码
作者: 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
把*.*改成*.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系统里面试了一下运行不成功,经过仔细排查后,我发现是- for /r "%SrcDir%" %%a in (*.*) do (
- if "%%~ta" leq "%DstDate%" (
- if exist "%%a" (
- echo del /f /q "%%a"
- )
- )
- )
复制代码
这句有问题,在NT系统的for命令下面没有"%%~ta"取时间的命令,因此我另寻他法- for /f "skip=3 tokens=1,3,*" %%a in ('dir %SrcDir%\*.* /tw /od') do (
- if %%a leq %DstDate% (
- del /f /q "%SrcDir%\%%c"
- )
- )
复制代码
在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# 喃喃努努 - set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%
复制代码
修改这一句
作者: 喃喃努努 时间: 2012-8-30 17:05
回复 喃喃努努 修改这一句
forfiles 发表于 2012-8-30 15:58
谢谢了,但是还有问题,- echo %DstDate%
- pause
- for /f "skip=3 tokens=1,3,*" %%a in ('dir %SrcDir%\*.* /tw /od') do (
- echo del /f /q %%a %SrcDir%\%%c
- )
- pause
- for /f "skip=3 tokens=1,3,*" %%a in ('dir %SrcDir%\*.* /tw /od') do (
- if "%%a" leq "%DstDate%" (
- echo del /f /q %SrcDir%\%%c
- )
- )
- 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 - set SrcDir=D:\temp1
- set DaysAgo=1
- >"%temp%\BackupDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")
- >>"%temp%\BackupDate.vbs" echo WScript.Echo WshShell.RegRead ("HKEY_CURRENT_USER\Control
- Panel\International\sShortDate")
- for /f %%a in ('cscript /nologo "%temp%\BackupDate.vbs"') do (
- set "RegDateOld=%%a"
- )
-
- pause
-
- >"%temp%\UnifyDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")
- >>"%temp%\UnifyDate.vbs" echo WshShell.RegWrite "HKEY_CURRENT_USER\Control
- Panel\International\sShortDate", "yyyy-M-d", "REG_SZ"
- cscript /nologo "%temp%\UnifyDate.vbs"
- >"%temp%\DstDate.vbs" echo LastDate=date()-%DaysAgo%
- >>"%temp%\DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^&
- month(LastDate),2) ^& right("0" ^& day(LastDate),2)
- >>"%temp%\DstDate.vbs" echo wscript.echo FmtDate
- for /f %%a in ('cscript /nologo "%temp%\DstDate.vbs"') do (
- set "DstDate=%%a"
- )
- set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%
-
- pause
-
- dir %SrcDir%\*.* /tw /od /tw
-
- pause
-
- for /f "skip=3 tokens=1,3,*" %%a in ('dir %SrcDir%\*.* /tw /od') do (echo %%a %%c)
-
- pause
-
- if "1" LEQ "2" echo del /f /q 123
- if "3" LEQ "2" echo del /f /q 456
-
- pause
-
- for /f "skip=3 tokens=1,3,*" %%a in ('dir %SrcDir%\*.* /tw /od') do (
- if "1" LEQ "2" (
- echo %%a %%c
- )
- )
-
- pause
-
-
- >"%temp%\RecoverDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")
- >>"%temp%\RecoverDate.vbs" echo WshShell.RegWrite "HKEY_CURRENT_USER\Control
- Panel\International\sShortDate", "%RegDateOld%", "REG_SZ"
- cscript /nologo "%temp%\RecoverDate.vbs"
-
- 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里面测试了一下没有问题:- set SrcDir=D:\temp1
- for /f "skip=3 tokens=1,3,*" %%a in ('dir %SrcDir%\*.* /tw /od') do (
- if "1" LEQ "2" (
- echo right %%a %%c
- ) else (
- echo wrong %%a %%c
- )
- )
- 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 |