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

Ero*_*ocM 1 windows batch-file

我看到旧帖子可以删除超过X天的文件,例如这个批处理文件可以删除超过N天的文件.我想为此添加一个额外的过滤器,这样如果我运行的备份没有发生2周,那么它就不会删除我的所有备份.

我知道这个:

forfiles -p "C:\what\ever" -s -m *.* -d <number of days> -c "cmd /c del @path"
Run Code Online (Sandbox Code Playgroud)

您可以删除超过X天但是如何添加上述条件并让它在删除之前留下最少的Z文件?

例:

假设我想删除超过14天的文件,但至少保留5个文件,其中包含以下文件:

Jan 1 - backup1.zip
Jan 2 - backup2.zip
Jan 3 - backup3.zip
Jan 4 - backup4.zip
Jan 5 - backup5.zip
Jan 6 - backup6.zip
Jan 7-20 no backups done
Jan 21st - script runs and removed old files
Run Code Online (Sandbox Code Playgroud)

使用示例代码删除超过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%
Run Code Online (Sandbox Code Playgroud)

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

dbe*_*ham 5

此脚本将删除超过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" 
  )
)  
Run Code Online (Sandbox Code Playgroud)