Batch file 批处理文件以删除早于指定日期的文件

Batch file 批处理文件以删除早于指定日期的文件,batch-file,Batch File,如何创建批处理文件以删除早于指定日期的文件 这似乎不起作用 :: --------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=

如何创建批处理文件以删除早于指定日期的文件

这似乎不起作用

:: --------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-------------

我不知道你是否可以用.BAT文件和Windows附带的几个工具来实现这一点,但你肯定可以用.js(JScript)或.vbs(VBScript)文件来实现。你是在Windows下做的,对吗?如果是这样,那么Windows可以处理.js和.vbs文件,默认情况下也可以处理.bat文件。它们的力量要大得多


而且,如果您恰好只针对Windows Server 2008,还有一个PowerShell甚至更好(可下载到其他Windows版本)。

我想知道为什么您必须使用ole DOS shell。。。或者是2008年的正确选择:)

编辑:我想出来了

要删除早于给定日期的所有文件,请执行以下操作:

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"
要删除比给定日期更新的所有文件,请执行以下操作:

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"
我使用以下脚本:

////////////////////////////////////////////////////////
// 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);
    }
}

如果你愿意,我的解决方案就行了

  • 在您的系统上安装
    touch
    实用程序(我有)
  • 或者可以使用
    date
    命令临时更改系统日期(可能不是这样,但谁知道呢)
我的想法是:

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

  • 使用('dir/od')中的/f%%I的
    迭代按日期排序的所有文件,逐个删除它们。遇到(并删除)信号文件后,停止删除


  • 我发现你的xcopy解决方案确实很好用!我最喜欢它的一点是,它应该在Windows语言版本中工作,而不是在英语版本中,因为XCOPY参数的格式似乎与日期设置无关。太好了!;]

    一个改进是预先创建文件_to_KEEP.TXT文件,这样,如果没有文件符合KEEP标准,第二个XCOPY语句仍然可以继续执行删除操作(如果找不到文件_to_KEEP.TXT文件,则会失败)。以下是我的脚本(请注意,在本例中,我将其更改为仅删除*.pdf文件,并且我还更改了临时文件名,以确保没有潜在冲突,以及随后清理临时文件):


    如果您在Windows服务器上和/或安装了服务器资源工具包,则可能正是您想要的

    示例: 打印所有文件名,超过180天

    forfiles /S /D -180 /C "cmd /C Echo @Path" >olderthan180days.txt
    
    删除所有超过365天的PDF文件

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

    也许你会喜欢这样:

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

    他正在使用set/a。这在DOS中是行不通的。因此,他使用cmd,实际上这仍然是一个非常明智的选择(即使很麻烦),因为它是唯一能在每个窗口上工作的东西(除了WSH,但它可以通过组策略锁定)。一个基于.BAT文件的新方法只使用内部cmd.EXE命令发布在这里:我不同意这是一个重复的问题。。。这是相似但不相同的:删除比给定日期早的文件与删除比N天早的文件,使用第二个in意味着计算两个日期之间的天数,这在批处理文件中不是微不足道的。。。我没有投你那一票。但我认为这是因为这更像是一个评论而不是一个回答。@Derek-哦,好吧。对不起。:)与这里的其他答案相比,这似乎是一种非常危险的方法。@Dan如果您指的是信号文件可能会出现问题,可以通过将(2)分为两个阶段来防止这种情况发生:2.1通过如上所述运行循环来构建脚本,将带有文件名的del命令回显到临时文件中;2.2调用所述临时文件,但仅当遇到信号文件时。否则,中止。无论如何,这个解决方案当然是一个难题。我只是在想,如果你不小心对文件排序错误,你可能会在到达你不想删除的信号文件之前删除数千个文件。我不喜欢有一个信号文件的想法,而不是在删除之前明确检查每个文件的时间戳,以100%确定您可以丢失它。我也不太明白你的方法是如何处理子目录的(不确定这是否是OP的要求,但对我来说是这样)。@Dan IMO,错误地排序文件并不比错误地键入截止日期更危险,结果也是一样的。子目录可以通过递归地应用整个过程来处理。。虽然我不知道为什么我要在不断扩大的需求中保持这种方法的可行性。如果在我控制的PC上执行此操作,我只需抓取GNU
    find
    (例如,从UnxUtils)的Win端口并使用它即可:谢谢你的提示,我已经安装了Git Bash,它与GNU
    find
    ;一起提供)该网站现在开始出售…我已经更新了URL。很好的解决方案,正是我所需要的