Windows批处理文件删除超过X天的文件,但至少保留X个文件

Windows批处理文件删除超过X天的文件,但至少保留X个文件,windows,batch-file,Windows,Batch File,我看到过一些旧的帖子,你可以删除超过X天的文件,比如这篇。我想在此添加一个额外的过滤器,这样,如果我正在运行的备份在两周内没有发生,那么它就不会删除我的所有备份 我知道: forfiles -p "C:\what\ever" -s -m *.* -d <number of days> -c "cmd /c del @path" 使用删除所有超过14天的文件的示例代码,我的所有备份文件都将被删除,并且没有备份。我希望脚本只剩下6个文件,并保留至少5个文件 有道理吗?这是否可以通过wi

我看到过一些旧的帖子,你可以删除超过X天的文件,比如这篇。我想在此添加一个额外的过滤器,这样,如果我正在运行的备份在两周内没有发生,那么它就不会删除我的所有备份

我知道:

forfiles -p "C:\what\ever" -s -m *.* -d <number of days> -c "cmd /c del @path"
使用删除所有超过14天的文件的示例代码,我的所有备份文件都将被删除,并且没有备份。我希望脚本只剩下6个文件,并保留至少5个文件

有道理吗?这是否可以通过windows批处理文件实现

为清晰起见

这是我拥有的批处理文件的一部分:

cd /d %BKUPDIR%
FOR /f "skip=14 delims=" %%A IN ('DIR /a:-d /b /o:-d /t:c %1*.zip ^2^>nul') DO IF EXIST "%%~fA" ECHO "%%~fA" >>%LOGFILE%
FOR /f "skip=14 delims=" %%A IN ('DIR /a:-d /b /o:-d /t:c %1*.zip ^2^>nul') DO IF EXIST "%%~fA" DEL "%%~fA" >>%LOGFILE%
FOR /f "skip=14 delims=" %%A IN ('DIR /a:-d /b /o:-d /t:c %1*.log ^2^>nul') DO IF EXIST "%%~fA" ECHO "%%~fA" >>%LOGFILE%
FOR /f "skip=14 delims=" %%A IN ('DIR /a:-d /b /o:-d /t:c %1*.log ^2^>nul') DO IF EXIST "%%~fA" DEL "%%~fA" >>%LOGFILE%

这些文件是我要删除的zip文件和日志文件,它们都位于同一文件夹中。

此脚本将删除所有超过14天的zip文件和日志文件,每个文件至少保留5个最新文件(总共10个),而不考虑年龄

请注意,FORFILES/D选项基于上次修改的日期,因此我没有使用创建日期对DIR命令进行排序

FORFILES命令非常慢,所以一旦我检测到一个超过14天的文件,我就不必再运行FORFILES了,因为我知道所有剩余的文件都是这个年龄或更早的

@echo off
pushd "c:\yourBackupPath"
for %%X in (zip log) do (
  set "skip=1"
  for /f "skip=5 delims=" %%F in ('dir /b /a-d /o-d /tw *.%%X') do (
    if defined skip forfiles /d -14 /m "%%F" >nul 2>nul && set "skip="
    if not defined skip del "%%F" 
  )
)  

您想保留最新或最旧的文件?@npocmaka很好的问题,我想保留最新的文件。您的所有文件都位于同一文件夹中还是可能位于子文件夹中?如果它们位于同一文件夹中,是否还有其他文件/文件夹?@CristiFati我添加了其他信息,希望能回答您的问题。我查看了批处理文件,我认为它应该可以工作。(完成后,您可以回显文件名,并在相同的
for
中删除它)。tyvm我将尝试一下!似乎有效,但每次运行后我都会收到一个未找到的文件。我已经用几种方法对它进行了测试,我应该担心吗?我无法想象“FILE NOT FOUND”消息来自何处,除非您缺少一种文件类型(.zip或.log)。如果这是错误消息的来源,那么您应该没事(当然,假设文件类型丢失是可以的)。啊,就是这样,目录中没有日志文件。谢谢你的帮助!看起来像火星上的胡言乱语,但很管用。谢谢:-)
@echo off
pushd "c:\yourBackupPath"
for %%X in (zip log) do (
  set "skip=1"
  for /f "skip=5 delims=" %%F in ('dir /b /a-d /o-d /tw *.%%X') do (
    if defined skip forfiles /d -14 /m "%%F" >nul 2>nul && set "skip="
    if not defined skip del "%%F" 
  )
)