我创建了一个批处理文件,目的是精简旧的备份文件。更具体地说,该脚本会识别上次修改日期在 183 到 365 天之间的备份文件,在整个 6 个月期间内每 7 天删除所有 bar 一个文件。如果在 7 天内有零个或一个文件,则不会删除任何文件。
该脚本基本上可以工作,但依赖于一个临时文件来存储每 7 天的匹配文件的文件名。我想知道是否可以修改脚本以在不需要临时文件的情况下执行相同的操作。
该脚本的灵感来自aschipfl解决FORFILES
设计缺陷的答案中描述的技术。这种技术有效地增强FORFILES
了 ,因此它可以识别在两个日期(或几天)之间最后修改的文件。我看到的困难在于FORFILES
“文件识别”输出被重定向到CON
设备。这意味着输出不可用于FOR /F
循环进行进一步处理。所以我的“快速修复”是将输出重定向到一个临时文件,FOR /F
循环可以访问该文件。我想知道是否可以插入一些文件描述符魔术来利用输出到FOR
.
这是我的(非破坏性)脚本:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET BACKUPFILEMASK=*.7z
SET DAYS_OLD_EARLIEST=183
SET DAYS_OLD_LATEST=365
SET TMPFILENAME=thin_out_logging.txt
FOR /L %%A IN (%DAYS_OLD_EARLIEST%,7,%DAYS_OLD_LATEST%) DO (
ECHO Iteration: %%A
SET /A ADDWEEK=%%A+7
>NUL 2>&1 FORFILES /M %BACKUPFILEMASK% /D -%%A /C "CMD /C IF @ISDIR==FALSE 2>NUL FORFILES /M @FILE /D -!ADDWEEK! || >> "%TMP%\%TMPFILENAME%" ECHO @FILE"
FOR /F %%B IN ('TYPE "%TMP%\%TMPFILENAME%" ^| FIND "" /V /C') DO SET /A LINES=%%B
ECHO Lines counted for week: !LINES!
IF !LINES! GEQ 2 (
FOR /F "skip=1 usebackq tokens=*" %%C IN ("%TMP%\%TMPFILENAME%") DO ECHO DEL %%C
)
ECHO ---
BREAK>"%TMP%\%TMPFILENAME%"
)
DEL "%TMP%\%TMPFILENAME%"