批处理bat问题:删除一个文件夹下特定子文件夹下指定时间前的文件

如在D盘下有upload文件夹
upload文件夹有很多个文件夹如"cut","ent","digi","pic"……等等
比如我要删除"cut","ent","digi"这几个文件夹中700天前的文件,用于每天执行一次
bat文件怎么写?

@echo off
::功能:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件
rem 指定待删除文件的存放路径(兼容含有空格的文件夹)
set SrcDir=D:\upload\cut
rem 指定天数
set DaysAgo=700
::如果演示没问题,请把下行的 echo 删掉,以便实际删除文件。
forfiles /p "%SrcDir%" /s /m *.* /d -%DaysAgo% /c "cmd /c echo del /f /q /a @path"
pause >nul
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-05-14
@echo off
regedit /e "%temp%\bak.reg" "HKEY_CURRENT_USER\Control Panel\International"
::::统一格式化系统日期格式Win2000以上系统通用
>aDate.reg echo REGEDIT4
>>aDate.reg echo.
>>aDate.reg echo [HKEY_CURRENT_USER\Control Panel\International]
>>aDate.reg echo "sShortDate"="yyyy-MM-dd"
>>aDate.reg echo "sDate"="-"
>>aDate.reg echo "sTimeFormat"="HH:mm:ss"
regedit /s aDate.reg&del aDate.reg
>tmp.vbs echo Wscript.echo FormatDateTime(DateAdd("d", -700 ,Date),2)
for /f "delims=" %%i in ('cscript.exe //nologo tmp.vbs') do set tt=%%i&rem del tmp.vbs
::::还原系统原时间日期格式
regedit /s "%temp%\bak.reg"&del "%temp%\bak.reg"
echo 700天前是 %tt%
set "tt=%tt:/=%"
set "tt=%tt:-=%"
for %%z in ("cut","ent","digi") do call :slz %%z
echo 已完成
pause

:slz
if "%~1"=="" goto:eof
setlocal enabledelayedexpansion
for /f "delims=*" %%i in ('dir/s/a-d/b "D:\upload\%~1\*.*"') do (
for /f "delims= " %%a in ("%%~ti") do (
set "tti=%%a"
set "tti=!tti:/=!"
set "tti=!tti:-=!"
if !tti! lss %tt% del /f/a/q "%%i"&&echo 已删除 %%i
))
endlocal
goto:eof追问

您好,您的代码我已测试可以删除,但我当时没说明白,还要请教修改,一,upload文件夹下不止这三个文件夹,有五六十个,而且隔一段时间做专题还得增加,我只能把所有目录都像你代码里一样列进去吗?不能遍历upload下的所有目录?二,upload下的所有目录下还包含文件夹,是自动生成的以月份命名,如“2010-05”和“2010-5”两种格式的文件夹,超期的文件夹我也要删除,三,这个删除是以修改日期还是文件创建日期?麻烦改改谢谢!

追答

不就是D:\upload下的所有目录,说那么复杂干吗!
是以修改日期

@echo off
regedit /e "%temp%\bak.reg" "HKEY_CURRENT_USER\Control Panel\International"
::::统一格式化系统日期格式Win2000以上系统通用
>aDate.reg echo REGEDIT4
>>aDate.reg echo.
>>aDate.reg echo [HKEY_CURRENT_USER\Control Panel\International]
>>aDate.reg echo "sShortDate"="yyyy-MM-dd"
>>aDate.reg echo "sDate"="-"
>>aDate.reg echo "sTimeFormat"="HH:mm:ss"
regedit /s aDate.reg&del aDate.reg
>tmp.vbs echo Wscript.echo FormatDateTime(DateAdd("d", -700 ,Date),2)
for /f "delims=" %%i in ('cscript.exe //nologo tmp.vbs') do set tt=%%i& del tmp.vbs
::::还原系统原时间日期格式
regedit /s "%temp%\bak.reg"&del "%temp%\bak.reg"
echo 700天前是 %tt%
set "tt=%tt:/=%"
set "tt=%tt:-=%"
for /f "delims=*" %%z in ('dir/ad/b "D:\upload"') do call :slz %%z
echo 已完成
pause

:slz
if "%~1"=="" goto:eof
setlocal enabledelayedexpansion
for /f "delims=*" %%i in ('dir/s/a-d/b "D:\upload\%~1\*.*"') do (
for /f "delims= " %%a in ("%%~ti") do (
set "tti=%%a"
set "tti=!tti:/=!"
set "tti=!tti:-=!"
if !tti! lss %tt% del /f/a/q "%%i"&&echo 已删除 %%i
))
endlocal
goto:eof

本回答被提问者采纳
第2个回答  2019-12-20
要是有个2013111,这是11月1号,还是1月11号????????,本身这样做备份文件名就不太合理的,要做也做成yyyymmdd全用8位格式的.
下面代码是比较文件的创建时间来处理,不是比较文件夹名称上的时间
测试结果正确后删除第6行的echo
@echo off
for /f "tokens=1-3 delims=/- " %%a in ("%date%")do set/a y=%%a,m=1%%b%%100,d=1%%c%%100,"m=(m+9)%%12,y-=m/10+1900,i=365*y+y/4+(m*153+2)/5+d-1"
for /f "tokens=1,4" %%i in ('dir /tc/ad backup*^|find "
"') do (
setlocal enabledelayedexpansion
for /f "tokens=1-3 delims=/- " %%a in ("%%i")do set/a y=%%a,m=1%%b%%100,d=1%%c%%100,"m=(m+9)%%12,y-=m/10+1900,i-=365*y+y/4+(m*153+2)/5+d-1"
if !i! gtr 7 echo rd /s/q "%%j"
endlocal
)
pause&exit /b
相似回答