batch file删除比指定date更早的文件

可能重复:
批文件删除N天以前的文件

如何创buildbatch file来删除比特定date早的文件?

这似乎不工作;

:: --------DELOLD.BAT---------- @echo off SET OLDERTHAN=%1 IF NOT DEFINED OLDERTHAN GOTO SYNTAX for /f "tokens=2" %%i in ('date /t') do set thedate=%%i type %1 pause set mm=%thedate:~0,2% set dd=%thedate:~3,2% set yyyy=%thedate:~6,4% set /A dd=%dd% - %OLDERTHAN% set /A mm=%mm% + 0 if /I %dd% GTR 0 goto DONE set /A mm=%mm% - 1 if /I %mm% GTR 0 goto ADJUSTDAY set /A mm=12 set /A yyyy=%yyyy% - 1 :ADJUSTDAY if %mm%==1 goto SET31 if %mm%==2 goto LEAPCHK if %mm%==3 goto SET31 if %mm%==4 goto SET30 if %mm%==5 goto SET31 if %mm%==6 goto SET30 if %mm%==7 goto SET31 if %mm%==8 goto SET31 if %mm%==9 goto SET30 if %mm%==10 goto SET31 if %mm%==11 goto SET30 if %mm%==12 goto SET31 goto ERROR :SET31 set /A dd=31 + %dd% goto DONE :SET30 set /A dd=30 + %dd% goto DONE :LEAPCHK set /A tt=%yyyy% %% 4 if not %tt%==0 goto SET28 set /A tt=%yyyy% %% 100 if not %tt%==0 goto SET29 set /A tt=%yyyy% %% 400 if %tt%==0 goto SET29 :SET28 set /A dd=28 + %dd% goto DONE :SET29 set /A dd=29 + %dd% :DONE if /i %dd% LSS 10 set dd=0%dd% if /I %mm% LSS 10 set mm=0%mm% for %%i in (*.*) do ( set FileName=%%i call :PROCESSFILE %%~ti ) set mm= set yyyy= set dd= set thedate= goto EXIT :SYNTAX ECHO. ECHO USAGE: ECHO DELOLD X ECHO Where X is the number of days previous to Today. ECHO. ECHO EX: "DELOLD 5" Deletes files older than 5 days. GOTO EXIT :PROCESSFILE set temp=%1 set fyyyy=20%temp:~6% set fmm=%temp:~0,2% set fdd=%temp:~3,2% if /I %fyyyy% GTR 2069 set fyyyy=19%temp:~6% :: *************************************** :: * This is where the files are deleted * :: * Change the ECHO command to DEL to * :: * delete. ECHO is used for test. * :: *************************************** if /I %yyyy%/%mm%/%dd% GEQ %fyyyy%/%fmm%/%fdd% ( ECHO %FileName% ) set temp= set fyyyy= set fmm= set fdd= :EXIT :: ----------END-DELOLD.BAT------------- 

Solutions Collecting From Web of "batch file删除比指定date更早的文件"

我使用这个脚本:

 //////////////////////////////////////////////////////// // Deletes file older than a number of days // in the current directory //////////////////////////////////////////////////////// // Usage: wscript DeleteOlderThan.js [#Days] // By default, remove files older than 30 days //////////////////////////////////////////////////////// function removeDays(date, nDays) { var dateRet = date return dateRet.setDate(date.getDate() - nDays); } function addSlash(strPath) { var c = strPath.substr(-1, 1); if( c !== '\\' && c !== '/' ) { strPath += '\\'; } return strPath; } // Read arguments var nDays = WScript.Arguments(0) || 30; // Create system objects var fs = WScript.CreateObject("Scripting.FileSystemObject"); var shell = WScript.CreateObject("WScript.Shell"); // Retrieve current directory var strDirectoryPath = addSlash(shell.CurrentDirectory); // Compute date var dateNow = new Date(); var dateTest = removeDays(dateNow, nDays); // Iterate on files var folder = fs.GetFolder(strDirectoryPath); var files = folder.Files; for( var it = new Enumerator(files); !it.atEnd(); it.moveNext() ) { var file = it.item(); if( file.DateLastModified < dateTest) { file.Delete(true); } } 

我每天都在调用:

 wscript "C:\Program Files\Utils\DeletesOlderThan.js" 30 

如果您在Windows服务器上和/或安装了服务器资源工具包, forfiles可能正是您要查找的内容。

例如:打印所有文件名,大于180天

 forfiles /S /D -180 /C "cmd /C Echo @Path" >olderthan180days.txt 

删除所有PDF文件,超过365天

 forfiles /S /M *.pdf /D -365 /C "cmd /C Del @Path" 

编辑:我想通了。

要删除比给定日期更早的所有文件:

 REM del_old.bat REM usage: del_old MM-DD-YYY for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> FILES_TO_KEEP.TXT for /f "tokens=*" %%a IN ('xcopy *.* /L /I /EXCLUDE:FILES_TO_KEEP.TXT null') do if exist "%%~nxa" del "%%~nxa" 

要删除比给定日期更新的所有文件:

 REM del_new.bat REM usage: del_new MM-DD-YYYY for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist "%%~nxa" del "%%~nxa" 

eJames:我发现你的xcopy解决方案工作得很好,的确如此! 我最喜欢的东西是,它应该在除英语以外的Windows语言版本中工作,因为XCOPY参数的格式似乎与日期设置无关。 精彩! ]

一种改进是预先创建FILES_TO_KEEP.TXT文件,以便如果没有文件匹配keep标准,则第二个XCOPY语句仍然可以继续执行删除操作(如果找不到FILES_TO_KEEP.TXT文件,则会失败)。 这里是我的脚本(请注意在这个例子中,我改变它只删除* .pdf文件,我也改变了临时文件名,以确保没有潜在的冲突,以及清理后的临时文件):

 @echo off SET OLDERTHAN=%1 IF NOT DEFINED OLDERTHAN GOTO SYNTAX echo >> ~~~FILES_TO_KEEP.TXT~ for /f "tokens=*" %%a IN ('xcopy *.pdf /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> ~~~FILES_TO_KEEP.TXT~ for /f "tokens=*" %%a IN ('xcopy *.pdf /L /I /EXCLUDE:~~~FILES_TO_KEEP.TXT~ null') do if exist "%%~nxa" del "%%~nxa" del ~~~FILES_TO_KEEP.TXT~ GOTO END :SYNTAX ECHO. ECHO USAGE: ECHO DELOLD mm-dd-yyyy ECHO Where mm-dd-yyyy is the date prior to which you want to delete files. ECHO. ECHO EX: "DELOLD 10-17-2008" Deletes files older than October 17, 2008. ECHO. ECHO This should work on any language version of Windows, but has only been ECHO tested in English-US versions. GOTO END :END 

我的解决方案如果你工作

  • 在你的系统上有一个touch工具(我这样做)
  • 或者可以使用date命令暂时改变系统日期(这可能不是这种情况,但是谁知道)

这是这个想法:

  1. 在目标目录中,创建一个信号文件(具有唯一的名称),时间戳等于删除阈值时间。 它可以通过touch (它接受所需的时间戳作为参数)来完成,或者通过用date /T记住当前日期,使用date <param>将系统日期更改为所需,并恢复原始日期。

  2. for /f %%I in ('dir /od')遍历按日期排序的所有文件,逐个删除它们。 遇到(并删除)信号文件后,请停止删除。

也许你会喜欢这个: http : //blog.jumlin.com/2010/10/move-files-in-folders-and-subfolders-older-than-one-year/

这是一个脚本,将移动文件超过一年,它甚至支持各种日期格式和子文件夹。 您可以进行一些更改,使其删除而不是移动它们。 它是一个非常完整的脚本与评论和解释。

我不知道为什么你必须使用ole DOS shell … Python或Windows Powershell将是2008年的正确选择:)

我不知道你是否可以用.BAT文件来做到这一点,以及Windows自带的几个工具,但你可以使用.js(JScript)或.vbs(VBScript)文件。 你在Windows下这样做,对吧? 如果是这样,那么Windows可以处理.js和.vbs文件,就像.bat文件一样默认。 他们更强大。

而且,如果您碰巧只针对Windows server 2008,那么PowerShell就更好了(可以下载其他Windows版本)。