我正在寻找一种删除批处理文件中所有7天以上的文件的方法。我在网上搜索,发现了一些包含数百行代码的示例,而另一些示例则需要安装额外的命令行实用程序才能完成任务。几行代码。似乎可以对Windows中的批处理文件至少进行一些远程操作。我正在寻找一种可以在标准Windows命令提示符下运行且没有任何其他实用程序的解决方案。请不要使用PowerShell或Cygwin。

评论

Jeff Atwood在Serverfault上回答了这个问题,我认为应该在此处进行记录。 serverfault.com/questions/49614/delete-files-older-than-x-days

一种仅使用内部CMD.EXE命令的基于.BAT文件的新方法已发布在此处:stackoverflow.com/questions/9746778/…

gehrcke.de/timegaps就是为此目的而设计的。它甚至允许使用更复杂的删除方案:除了保留最近7天的文件外,例如还允许在最近8周,12个月,2年的每一年保留一份文件。

#1 楼

请享用:

forfiles -p "C:\what\ever" -s -m *.* -d <number of days> -c "cmd /c del @path"


有关更多详细信息,请参见forfiles文档。

如果您的计算机上未安装forfiles,请将其从任何Windows Server 2003复制到Windows XP计算机上,位于%WinDir%\system32\。这是可能的,因为EXE与Windows Server 2003和Windows XP完全兼容。较新的版本(包括Windows 10):

语法稍有变化。因此,更新后的命令为:

forfiles /p "C:\what\ever" /s /m *.* /D -<number of days> /C "cmd /c del @path"


评论


应该是del @FILE,区分大小写另外我建议使用/ c echo @FILE进行测试

–拉塞尔·斯蒂恩(Russell Steen)
09-09-16 14:55

@Russell:@PATH是完整路径,包括名称。 @FILE仅是名称,因此,如果您要处理子文件夹,它将无法工作。

– gregmac
2010-3-18在16:27

请注意,如果您希望文件的日期超过10天,则需要指定-d“ -10”。 -ve表示“大于”,+ ve表示“大于”。您还可以将DDMMYY或-DDMMYY格式指定为-d的参数。

– gregmac
2010-3-18在16:28

我在Win Server 2008上使用了以下语法:forfiles / P“ C:\ Mysql_backup” / S / M * .sql / D -30 / C“ cmd / c del @PATH”

– jman
2011年4月18日在8:42



当“早于7天”被定义为“修改超过7天”而不是“创建超过7天”时,此答案有效。后者如何实现?

– Tims
13-10-18在10:50

#2 楼

运行以下命令:

ROBOCOPY C:\source C:\destination /mov /minage:7
del C:\destination /q


移动所有文件(使用/ mov移动文件,然后删除它们,而/ move则移动整个文件树,然后移动通过robocopy删除)到另一个位置,然后在该路径上执行delete命令,一切都很好。

如果目录中有很多数据,也可以使用/mir开关

评论


在大多数情况下,这是一个不切实际的答案。如果我的目录中包含大量数据,则该目录将无法正常工作。我会选择“到位”的答案之一

–adamb0mb
13年10月1日在22:37

@ adamb0mb这绝不是不切实际的-如果“目标”与“源”在同一文件系统上,则移动操作非常轻巧。由于robocopy确实很健壮,因此它实际上适用于任何目录大小,晦涩的文件名,基本上任意的路径长度,并在需要时包含目录-对于许多其他Windows实用程序肯定不能说些什么。我会使用rd / s / q c:\ destination而不是del命令,或者如果您希望遇到文件名问题,甚至可以使用另一个robocopy / mir c:\ emptydir c:\ destination来清空目录。

–syneticon-dj
13年7月7日在8:43

另外,robocopy确实支持UNC路径-接受的答案中的forfiles将不起作用。

–syneticon-dj
13年7月7日在8:47

我的想法更像是:“我的文件已经在我想要的位置了。我不想移动它们。” “从逻辑上说,删除文件就是您正在做的,所以这样做。不要让Robocopy超载来做到这一点”

–adamb0mb
13年11月13日,0:20



我建议使用这种单行代码来查看C:\ test中7天之前的所有文件。要删除文件,请将echo更改为del:forfiles / p“ C:\ test” / m“ *。*” / c“ cmd / c echo @file” / D -7

– PowerUser
2015年2月4日在22:10



#3 楼

Ok有点无聊,并提出了这个建议,其中包含我的一个穷人的Linux时代替换版本,该替换仅限于日常使用(无时间限制):

7daysclean.cmd

@echo off
setlocal ENABLEDELAYEDEXPANSION
set day=86400
set /a year=day*365
set /a strip=day*7
set dSource=C:\temp

call :epoch %date%
set /a slice=epoch-strip

for /f "delims=" %%f in ('dir /a-d-h-s /b /s %dSource%') do (
    call :epoch %%~tf
    if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)
)
exit /b 0

rem Args[1]: Year-Month-Day
:epoch
    setlocal ENABLEDELAYEDEXPANSION
    for /f "tokens=1,2,3 delims=-" %%d in ('echo %1') do set Years=%%d& set Months=%%e& set Days=%%f
    if "!Months:~0,1!"=="0" set Months=!Months:~1,1!
    if "!Days:~0,1!"=="0" set Days=!Days:~1,1!
    set /a Days=Days*day
    set /a _months=0
    set i=1&& for %%m in (31 28 31 30 31 30 31 31 30 31 30 31) do if !i! LSS !Months! (set /a _months=!_months! + %%m*day&& set /a i+=1)
    set /a Months=!_months!
    set /a Years=(Years-1970)*year
    set /a Epoch=Years+Months+Days
    endlocal& set Epoch=%Epoch%
    exit /b 0


使用情况

set /a strip=day*7:将保留天数更改为7。

set dSource=C:\temp:这是检查文件的起始目录。

注释

这是非破坏性代码,它将显示会发生的事情。

更改:

if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)


到类似这样的内容:到28天难过的岁月真是令人难以置信。如果某人的想法是不添加10行代码,请继续发布,然后将其添加到我的代码中。

时代:我没有考虑时间,因为需要删除早于某个特定日期的文件(耗时数小时/分钟)会从本该保留的那一天删除文件。 YYYY-MM-DD。需要对其进行调整以用于其他设置或运行时评估(读取sShortTime,用户绑定配置,在过滤器中配置适当的字段顺序,并使用过滤器从参数中提取正确的数据)。

我是否提到我讨厌编辑器的自动格式化?它会删除空白行,并且复制粘贴真是个地狱。

希望对您有所帮助。

评论


+1为非破坏性代码,当我自己提供代码示例时,我会尽量记住这一点。

–豪特
2014年9月10日在8:09

很晚了,完全没有关系,但是7daysclean.cmd听起来像是Synth-Punk乐队的一个了不起的名字。

– Flonk
17年6月19日在14:02



如何对其进行编辑以使用文件夹?

–PerfectContrast
10月5日17:54

#4 楼

forfiles /p "v:" /s /m *.* /d -3 /c "cmd /c del @path"


您应该做/d -3(提前3天),对我来说很好。因此,所有复杂的批次都可以放在垃圾箱中。另外,forfiles不支持UNC路径,因此请建立到特定驱动器的网络连接。

评论


与其他答案(包括已接受的答案)相同的错误。指定*。*的这种奇怪习惯从何而来?通配符*。*与Windows中的所有文件都不匹配。仅匹配带有的文件。以他们的名字。 OP从未说过有关要求的任何事情。在文件名中。正确的参数是/ M *,但这还是默认值。根本不需要/ M。

– AnT
2015年11月21日17:38



@AnT:您确定吗?我认为*。*的行为与Windows中的*完全相同。实际上,我只是在计算机上尝试过,dir *。*确实列出了测试文件,该文件没有扩展名。

– Andreas Rejbrand
18年1月11日在11:19

@Andreas Rejbrand:我也感到惊讶,但是*。*的处理在forfiles的dir和-m选项之间是不一致的。正如我在上面的评论中所述(您自己尝试),-m *。*掩码确实会跳过无扩展名的文件名。有趣的是,MS文档明确指出-m *。*是默认值。但是,如果您在现实生活中尝试过,您会发现默认值实际上是-m *-所有文件都经过迭代。

– AnT
18年1月16日在1:58



该MS文档页面-technet.microsoft.com/zh-cn/library/cc753551(v=ws.11).aspx-包含大量错误(例如,示例中),因为文档作者错误地认为*。 *掩码应用于所有文件。确实不需要我对“这种奇怪习惯”的追问,因为将*。*和*视为等同是一个长期存在的Windows约定。但是,由于某种原因,forfiles中的/ m选项碰巧违反了该约定。

– AnT
18年1月16日在2:40



Windows中5个通配符的背景:blogs.msdn.microsoft.com/jeremykuhne/2017/06/04/…

– MSalters
18年7月2日在10:33

#5 楼

看看我对类似问题的回答:

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"


这将删除早于给定日期的文件。我确定可以将其修改为从当前日期返回7天。

更新:我注意到HerbCSO在上述脚本上有所改进。我建议改用他的版本。

#6 楼

我的命令是

forfiles -p "d:\logs" -s -m*.log -d-15 -c"cmd /c del @PATH\@FILE" 


@PATH-在我的情况下只是路径,所以我不得不使用@PATH\@FILE
,但forfiles /?(不带“?”)工作正常。

我唯一的问题是:如何添加多个掩码(例如“ .log | .bak”)? />我在此处下载的所有关于forfiles.exe的文件(在Win XP上)

但是,如果您使用的是Windows服务器,forfiles.exe应该已经存在,并且与ftp版本有所不同。这就是为什么我应该修改命令。

对于Windows Server 2003,我正在使用以下命令:

forfiles -p "d:\Backup" -s -m *.log -d -15 -c "cmd /c del @PATH"


#7 楼

对于Windows Server 2008 R2:

forfiles /P c:\sql_backups\ /S /M *.sql /D -90 /C "cmd /c del @PATH"


这将删除所有90天以上的.sql文件。

#8 楼

批处理文件经常解决与相对日期/时间相关的问题。但是命令行解释器cmd.exe没有用于日期/时间计算的功能。已经在这里,Stack Overflow的其他页面以及其他网站上发布了许多使用其他控制台应用程序或脚本的有效解决方案。自确定日期以来的日期/时间字符串,以秒为单位。 1970-01-01 00:00:00 UTC很常见。但是,根据支持特定任务所需的日期范围,也可以使用以后的任何一天。 。但这并没有正确考虑leap年。 JR发布了一个将当前for日纳入考虑范围的附加组件,但忽略了自基准年(即1970年以来)以来的其他leap年。带有一个小的C函数,可以快速获取以C / C ++编写的应用程序中日期/时间转换函数中的天数,包括从1970-01-01开始的leap日。也可以使用FOR命令在批处理代码中使用。因此,我决定编写批处理子例程GetSeconds,该子例程计算自1970-01-01 00:00:00 UTC以来传递给该例程的日期/时间字符串的秒数。由于Windows文件系统也不支持leap秒,因此不予考虑。

首先,这些表:每年的01-01 00:00:00 UTC,包括leap日。仅在使用无符号的32位变量(即C / C ++中的无符号长(或无符号int))时才可能。

但是cmd.exe对于数学表达式使用带符号的32位变量。因此最大值为2147483647(0x7FFFFFFF),即2038-01-19 03:14:07。


1970年至2106年的Le年信息(否/是)。 br />
1970 - 1979:     0   365   730  1096  1461  1826  2191  2557  2922  3287
1980 - 1989:  3652  4018  4383  4748  5113  5479  5844  6209  6574  6940
1990 - 1999:  7305  7670  8035  8401  8766  9131  9496  9862 10227 10592
2000 - 2009: 10957 11323 11688 12053 12418 12784 13149 13514 13879 14245
2010 - 2019: 14610 14975 15340 15706 16071 16436 16801 17167 17532 17897
2020 - 2029: 18262 18628 18993 19358 19723 20089 20454 20819 21184 21550
2030 - 2039: 21915 22280 22645 23011 23376 23741 24106 24472 24837 25202
2040 - 2049: 25567 25933 26298 26663 27028 27394 27759 28124 28489 28855
2050 - 2059: 29220 29585 29950 30316 30681 31046 31411 31777 32142 32507
2060 - 2069: 32872 33238 33603 33968 34333 34699 35064 35429 35794 36160
2070 - 2079: 36525 36890 37255 37621 37986 38351 38716 39082 39447 39812
2080 - 2089: 40177 40543 40908 41273 41638 42004 42369 42734 43099 43465
2090 - 2099: 43830 44195 44560 44926 45291 45656 46021 46387 46752 47117
2100 - 2106: 47482 47847 48212 48577 48942 49308 49673



当年每个月第一天的天数。

1970 - 1989: N N Y N N N Y N N N Y N N N Y N N N Y N
1990 - 2009: N N Y N N N Y N N N Y N N N Y N N N Y N
2010 - 2029: N N Y N N N Y N N N Y N N N Y N N N Y N
2030 - 2049: N N Y N N N Y N N N Y N N N Y N N N Y N
2050 - 2069: N N Y N N N Y N N N Y N N N Y N N N Y N
2070 - 2089: N N Y N N N Y N N N Y N N N Y N N N Y N
2090 - 2106: N N Y N N N Y N N N N N N N Y N N
                                 ^ year 2100



使用这些表将日期转换为自1970-01-01以来的秒数非常容易。

请注意!

日期和时间字符串的格式取决于Windows区域和语言设置。必要时,必须将Day的第一个FOR循环中分配给环境变量MonthYearGetSeconds的定界符和标记顺序调整为本地日期/时间格式。如果环境变量DATE中的日期格式与%%~tF上的命令FOR使用的日期格式不同,则为环境变量的字符串。例如,当%DATE%扩展为Sun 02/08/2015%%~tF扩展为02/08/2015 07:38 PM时,可以使用以下代码将第4行修改为:

                   Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
Year with 365 days:  0  31  59  90 120 151 181 212 243 273 304 334
Year with 366 days:  0  31  60  91 121 152 182 213 244 274 305 335


这导致传递给子例程02/08/2015-日期字符串,其中不包含工作日缩写的3个字母和空格字符。 />
或者可以使用以下格式以正确的格式传递当前日期:

call :GetSeconds "%DATE:~4% %TIME%"


现在,日期字符串中的最后10个字符将传递给函数GetSeconds和因此,环境日期字符串是否无关紧要nment变量DATE带有或不带有工作日,只要日期和月份始终按预期顺序以两位数字表示,即格式为dd/mm/yyyydd.mm.yyyy。要删除的文件以及要保留在C:\Temp文件夹树中的文件,请参阅第一个FOR循环的代码。

call :GetSeconds "%DATE:~-10% %TIME%"


为了获得最佳性能,最好删除所有注释,即所有以rem开头的行都位于0-4个前导空格之后。上面的批处理代码目前支持01-01 00:00:00到2038-01-19 03:14:07,例如到2015-01-01到2019-12-31,因为下面的代码使用它来真正删除文件在C:\Temp文件夹树中早于7天。

此外,以下批处理代码针对24小时格式进行了优化。有关日期和时间格式的信息以及Windows上的文件时间比较,请参阅批处理文件中查找文件是否早于4个小时的答案,其中包含有关文件时间的许多其他信息。

#9 楼

对于Windows 2012 R2,可以使用以下命令:

评论


这甚至适用于Windows Server 2008及更高版本和Windows 7。

–kwrl
2015年10月12日13:25

#10 楼

复制此代码并将其另存为DelOldFiles.vbs

在CMD中的用法:cscript //nologo DelOldFiles.vbs 15

15表示删除过去15天以上的文件。

  'copy from here
    Function DeleteOlderFiles(whichfolder)
       Dim fso, f, f1, fc, n, ThresholdDate
       Set fso = CreateObject("Scripting.FileSystemObject")
       Set f = fso.GetFolder(whichfolder)
       Set fc = f.Files
       Set objArgs = WScript.Arguments
       n = 0
       If objArgs.Count=0 Then
           howmuchdaysinpast = 0
       Else
           howmuchdaysinpast = -objArgs(0)
       End If
       ThresholdDate = DateAdd("d", howmuchdaysinpast, Date)   
       For Each f1 in fc
     If f1.DateLastModified<ThresholdDate Then
        Wscript.StdOut.WriteLine f1
        f1.Delete
        n = n + 1    
     End If
       Next
       Wscript.StdOut.WriteLine "Deleted " & n & " file(s)."
    End Function

    If Not WScript.FullName = WScript.Path & "\cscript.exe" Then
      WScript.Echo "USAGE ONLY IN COMMAND PROMPT: cscript DelOldFiles.vbs 15" & vbCrLf & "15 means to delete files older than 15 days in past."
      WScript.Quit 0   
    End If

    DeleteOlderFiles(".")
 'to here


#11 楼

使用文件。

有不同的版本。早期的使用unix样式参数。

我的版本(对于Server 2000-注意开关后没有空格)-

forfiles -p"C:\what\ever" -s -m*.* -d<number of days> -c"cmd /c del @path"


要将文件添加到XP,请从ftp获取exe ://ftp.microsoft.com/ResKit/y2kfix/x86/

并将其添加到C:\ WINDOWS \ system32

评论


@Kibbee答案不一样,语法也不同。这是一种天才的尝试。我对Windows命令行知之甚少,因此花了数小时的挫折才能使它正常工作。对我来说,信息的关键在于以下事实:存在不同的版本(具有不同的语法),并且我需要删除空格。这些东西都不包含在原始答案中。 (我会在答案上发表评论,但我没有特权

–艾丹·埃文(Aidan Ewen)
2011年11月16日上午10:30

与其他答案(包括已接受的答案)相同的错误。 forfiles中的通配符*。*与所有文件都不匹配。仅匹配带有的文件。以其名称(即带有扩展名的文件)。 OP从未说过有关要求的任何事情。在文件名中。正确的参数是/ M *,但这还是默认值。根本不需要/ M。

– AnT
18年1月16日在2:07

#12 楼

IMO,JavaScript正在逐渐成为通用脚本标准:它可能比其他任何脚本语言在更多产品中可用(在Windows中,可以使用Windows Scripting Host获得)。我必须清理许多文件夹中的旧文件,因此,这是一个JavaScript函数:

// run from an administrator command prompt (or from task scheduler with full rights):  wscript jscript.js
// debug with:   wscript /d /x jscript.js

var fs = WScript.CreateObject("Scripting.FileSystemObject");

clearFolder('C:\temp\cleanup');

function clearFolder(folderPath)
{
    // calculate date 3 days ago
    var dateNow = new Date();
    var dateTest = new Date();
    dateTest.setDate(dateNow.getDate() - 3);

    var folder = fs.GetFolder(folderPath);
    var files = folder.Files;

    for( var it = new Enumerator(files); !it.atEnd(); it.moveNext() )
    {
        var file = it.item();

        if( file.DateLastModified < dateTest)
        {
            var filename = file.name;
            var ext = filename.split('.').pop().toLowerCase();

            if (ext != 'exe' && ext != 'dll')
            {
                file.Delete(true);
            }
        }
    }

    var subfolders = new Enumerator(folder.SubFolders);
    for (; !subfolders.atEnd(); subfolders.moveNext())
    {
        clearFolder(subfolders.item().Path);
    }
}


要清除每个文件夹,只需添加另一个调用即可clearFolder()函数。此特定代码还保留exe和dll文件,并清除子文件夹。

#13 楼

考虑到leap年,在7daysclean.cmd上进行此修改怎么样?

可以用少于10行的编码来完成! br />
由Mofi编辑:

由于语法无效,JR贡献的上述条件总是评估为false。必须仅在3月到12月的月份,而不是在2月,在done年中再增加一天的秒数。 Jay发布的7daysclean.cmd文件为:

set /a Leap=0
if (Month GEQ 2 and ((Years%4 EQL 0 and Years%100 NEQ 0) or Years%400 EQL 0)) set /a Leap=day
set /a Months=!_months!+Leap


#14 楼

我可能会对这个已经有价值的线程做出微不足道的贡献。我发现其他解决方案可能会摆脱实际的错误文本,但忽略了%ERRORLEVEL%,这表明我的应用程序失败。并且我合理地希望%ERRORLEVEL%,只要它不是“找不到文件”错误即可。

一些示例:

专门调试并消除错误:

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||echo found success


使用单线返回错误级别成功或失败:

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT /B 1||EXIT /B 0


使用单线保持错误级别为零,以在其他代码中间的批处理文件的上下文中成功执行(ver> nul重置错误级别):我登陆以下。我不知道这是否是一个错误,但该步骤中的CmdExec仅识别第一行代码:

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||ver > nul


#15 楼

天哪,已经有很多答案了。我发现的一种简单方便的方法是使用&参数从一条Windows命令行指令按顺序执行两次ROBOCOPY.EXE。

通过选择所有超过30天的文件(。)并将其移动到目标文件夹来工作。第二个命令通过添加PURGE命令再次执行相同的操作,这意味着删除源文件夹中不存在的目标文件夹中的文件。
因此,基本上,第一个命令移动文件,第二个删除文件,因为调用第二条命令时,源文件夹中将不再存在该文件。

咨询ROBOCOPY的文档,并在测试时使用/ L开关。

#16 楼

如果您拥有XP资源工具包,则可以使用robocopy将所有旧目录移动到一个目录中,然后使用rmdir删除该目录:

mkdir c:\temp\OldDirectoriesGoHere
robocopy c:\logs\SoManyDirectoriesToDelete\ c:\temp\OldDirectoriesGoHere\ /move /minage:7
rmdir /s /q c:\temp\OldDirectoriesGoHere


#17 楼

我认为e.James的回答很好,因为它早在Windows 2000 SP4(甚至更早)就可以与未经修改的Windows版本一起使用,但是它需要写入外部文件。这是一个修改后的版本,它在保持兼容性的同时不会创建外部文本文件:如果以天数为参数调用数学运算,那么它会为您完成所有数学运算:每个月的确切天数。唯一的最大值是自0/0/0以来的总天数(之后返回负数的年份)。它不能正确地从负输入中获取将来的日期(可以尝试,但可能会超过该月的最后一天)。

#18 楼

ROBOCOPY对我来说很棒。最初建议我的伊曼。但是,与其将文件/文件夹移动到一个临时目录,然后再删除该临时文件夹的内容,不如将它们移动到回收站!!!

这是我的备份批处理文件的几行,例如:

SET FilesToClean1=C:\Users\pauls12\Temp
SET FilesToClean2=C:\Users\pauls12\Desktop16 - Champlain\Engineering\CAD\Backups

SET RecycleBin=C:$Recycle.Bin\S-1-5-21-1480896384-1411656790-2242726676-748474

robocopy "%FilesToClean1%" "%RecycleBin%" /mov /MINLAD:15 /XA:SH /NC /NDL /NJH /NS /NP /NJS
robocopy "%FilesToClean2%" "%RecycleBin%" /mov /MINLAD:30 /XA:SH /NC /NDL /NJH /NS /NP /NJS


它会清除“临时”文件夹,在AutoCAD备份文件夹中保存30天。我使用变量是因为行可能会很长,并且可以将其重用于其他位置。您只需要找到与您的登录名关联的回收站的dos路径。

这对我来说是一台工作计算机,它可以工作。我了解到,有些人可能拥有更多的限制性权利,但还是可以尝试一下;)搜索Google以获取有关ROBOCOPY参数的说明。

干杯!

评论


现有的倒数第二个答案也支持RoboCopy。当然,您使用了一些不同的选项,但它与现有答案很接近。

–乔纳森·莱弗勒(Jonathan Leffler)
16年8月15日在16:07

该帖子具有新内容-将文件移动到回收站。 Robocopy尚未提出这一建议,它使用内置的单行命令完全回答了原始帖子。与可以使用“ DEL”和“ RMDIR”命令进行组合相比,其工作效果更好,因为可以从回收站中还原文件。嘿,我还是这里的新人,请休息一下;)

–肖恩·鲍里森(Shawn Pauliszyn)
16年9月1日在18:07

#19 楼

您也许可以做到这一点。您可以看一下这个问题,举一个简单的例子。当您开始比较日期时,就会变得很复杂。判断日期是否更大可能很容易,但是有很多情况需要考虑是否需要实际获得两个日期之间的差额。除非您真的不能使用第三方工具,否则请发明它。

#20 楼

这没什么了不起的,但是我今天需要做这样的事情并按计划任务运行它。

批处理文件DelFilesOlderThanNDays.bat下面带有示例exec w / params:


DelFilesOlderThanNDays.bat 7 C:\ dir1 \ dir2 \ dir3 \ logs * .log


echo off
cls
Echo(
SET keepDD=%1
SET logPath=%2 :: example C:\dir1\dir2\dir3\logs
SET logFileExt=%3
SET check=0
IF [%3] EQU [] SET logFileExt=*.log & echo: file extention not specified (default set to "*.log")
IF [%2] EQU [] echo: file directory no specified (a required parameter), exiting! & EXIT /B 
IF [%1] EQU [] echo: number of days not specified? :)
echo(
echo: in path [ %logPath% ]
echo: finding all files like [ %logFileExt% ]
echo: older than [ %keepDD% ] days
echo(
::
::
:: LOG
echo:  >> c:\trimLogFiles\logBat\log.txt
echo: executed on %DATE% %TIME% >> c:\trimLogFiles\logBat\log.txt
echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt
echo: in path [ %logPath% ] >> c:\trimLogFiles\logBat\log.txt
echo: finding all files like [ %logFileExt% ] >> c:\trimLogFiles\logBat\log.txt
echo: older than [ %keepDD% ] days >> c:\trimLogFiles\logBat\log.txt
echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt
::
FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c echo @path" >> c:\trimLogFiles\logBat\log.txt 2<&1
IF %ERRORLEVEL% EQU 0 (
 FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c echo @path"
)
::
::
:: LOG
IF %ERRORLEVEL% EQU 0 (
 echo:  >> c:\trimLogFiles\logBat\log.txt
 echo: deleting files ... >> c:\trimLogFiles\logBat\log.txt
 echo:  >> c:\trimLogFiles\logBat\log.txt
 SET check=1
)
::
::
IF %check% EQU 1 (
 FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c del @path"
)
::
:: RETURN & LOG
::
IF %ERRORLEVEL% EQU 0 echo: deletion successfull! & echo: deletion successfull! >> c:\trimLogFiles\logBat\log.txt
echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt


#21 楼

在扩展aku的答案时,我看到很多人在问UNC路径。只需将unc路径映射到驱动器号,即可使forfiles满意。例如,可以在批处理文件中以编程方式完成驱动器的映射和取消映射。

net use Z: /delete
net use Z: \unc\path\to\my\folder
forfiles /p Z: /s /m *.gz /D -7 /C "cmd /c del @path"


这将删除所有扩展名超过7天的.gz扩展名。如果要确保在使用Z:之前未将其映射到其他任何内容,可以执行以下操作:

net use Z: \unc\path\to\my\folder
if %errorlevel% equ 0 (
    forfiles /p Z: /s /m *.gz /D -7 /C "cmd /c del @path"
) else (
    echo "Z: is already in use, please use another drive letter!"
)


#22 楼

这是为我做的。它与日期配合使用,您可以减去所需的年份数以返回到时间:
在某些情况下,文件可能是只读的。

#23 楼

我删除特定年份之前的文件的脚本:

@REM _______ GENERATE A CMD TO DELETE FILES OLDER THAN A GIVEN YEAR
@REM _______ (given in _olderthanyear variable)
@REM _______ (you must LOCALIZE the script depending on the dir cmd console output)
@REM _______ (we assume here the following line's format "11/06/2017  15:04            58 389 SpeechToText.zip")

@set _targetdir=c:\temp
@set _olderthanyear=2017

@set _outfile1="%temp%\deleteoldfiles.1.tmp.txt"
@set _outfile2="%temp%\deleteoldfiles.2.tmp.txt"

  @if not exist "%_targetdir%" (call :process_error 1 DIR_NOT_FOUND "%_targetdir%") & (goto :end)

:main
  @dir /a-d-h-s /s /b %_targetdir%\*>%_outfile1%
  @for /F "tokens=*" %%F in ('type %_outfile1%') do @call :process_file_path "%%F" %_outfile2%
  @goto :end

:end
  @rem ___ cleanup and exit
  @if exist %_outfile1% del %_outfile1%
  @if exist %_outfile2% del %_outfile2%
  @goto :eof

:process_file_path %1 %2
  @rem ___ get date info of the %1 file path
  @dir %1 | find "/" | find ":" > %2
  @for /F "tokens=*" %%L in ('type %2') do @call :process_line "%%L" %1
  @goto :eof

:process_line %1 %2
  @rem ___ generate a del command for each file older than %_olderthanyear%
  @set _var=%1
  @rem  LOCALIZE HERE (char-offset,string-length)
  @set _fileyear=%_var:~0,4%
  @set _fileyear=%_var:~7,4%
  @set _filepath=%2
  @if %_fileyear% LSS %_olderthanyear% echo @REM %_fileyear%
  @if %_fileyear% LSS %_olderthanyear% echo @del %_filepath%
  @goto :eof

:process_error %1 %2
  @echo RC=%1 MSG=%2 %3
  @goto :eof


#24 楼

更灵活的方法是使用FileTimeFilterJS.bat
@echo off

::::::::::::::::::::::
set "_DIR=C:\Users\npocmaka\Downloads"
set "_DAYS=-5"
::::::::::::::::::::::

for /f "tokens=* delims=" %%# in ('FileTimeFilterJS.bat  "%_DIR%" -dd %_DAYS%') do (
    echo deleting  "%%~f#"
    echo del /q /f "%%~f#"
)

该脚本将允许您使用天,分钟,秒或小时之类的度量。访问或修改
在某个日期之前或之后(或两个日期之间)列出文件
选择是否显示文件或目录(或同时显示两个文件)
是否递归
>