我有一个正在运行的计划任务/脚本,每 3 小时对文件进行一次快照,但是文件正在增长并且磁盘空间有限,所以每周我都想执行一次清理。
至于现在我手动执行此操作,但是,我希望此任务可以自动化?
我真正想要的是,我有一个包含以下内容的目录:
B:\>dir
Volume in drive B is BACKUP
Volume Serial Number is ****-****
Directory of B:\
2015-03-04 13:04 <DIR> MEMORYCRASHDUMPS
2015-03-02 23:59 20 484 150 [20150302235959.082]-Logs.rar
2015-03-03 00:00 <DIR> Logs
2015-03-01 17:59 67 365 888 [20150301180000.085]-users.sqlite3
2015-03-01 22:50 67 480 576 [20150301230000.368]-users.sqlite3
2015-03-02 00:32 67 480 576 [20150302030000.378]-users.sqlite3
2015-03-02 06:22 67 503 104 [20150302080000.352]-users.sqlite3
2015-03-02 12:59 67 605 504 [20150302130000.084]-users.sqlite3
2015-03-02 17:59 67 740 672 [20150302180000.090]-users.sqlite3
2015-03-02 22:59 67 921 920 [20150302230000.418]-users.sqlite3
2015-03-03 02:58 67 960 832 [20150303030000.088]-users.sqlite3
2015-03-03 07:53 67 966 976 [20150303080000.456]-users.sqlite3
2015-03-03 12:59 68 013 056 [20150303130000.082]-users.sqlite3
2015-03-03 17:59 68 153 344 [20150303180000.081]-users.sqlite3
2015-03-03 22:54 68 339 712 [20150303230000.352]-users.sqlite3
2015-03-04 01:40 68 350 976 [20150304030000.090]-users.sqlite3
2015-03-04 07:51 68 367 360 [20150304080000.358]-users.sqlite3
2015-03-04 12:53 68 452 352 [20150304130000.085]-users.sqlite3
2015-03-04 17:58 68 718 592 [20150304180000.083]-users.sqlite3
我想删除所有内容./*-users.sqlite3
,除了最新的一个(奖励:除了最新的 N 个)。
是否有一个方便的内置 Windows 命令来实现这一点?
我确实已经检查了几个问题,虽然它们仅涉及按日期/年龄或模式删除文件,但它们并没有提供排除最新项目(仅限特定文件名)的方法。
答案1
简单 - 通过 FOR /F 处理按日期降序排序的目录列表,并跳过前 N 行。您的文件名已经包含按时间顺序正确排序的时间戳,因此您可以按名称排序。
以下将保留最近的 3 个文件。只需根据需要修改 SKIP 值即可。
for /f "skip=3 delims=" %F in ('dir /b /a-d /o-n "[*]-users.sqlite3"') do @del "%F"
您可以将以上内容放入批处理脚本中,并参数化跳过值。
清除日志程序
@echo off
pushd b:\
for /f "skip=%1 delims=" %%F in ('dir /b /a-d /o-n "[*]-users.sqlite3"') do del "%%F"
popd
要保留最近的 2 条日志,您可以使用:
purgeLog 2