问题:
最近遇到在备份文件夹数量过多导致占用内存猛增的情况,手动删除还得每次都得想着,于是写了一个bat脚本放在定时任务中让它自动删除。
思路:
遍历指定路径下的所有子文件夹,并按照创建时间由新到旧排序,保留一定数量的子文件夹,其他文件夹直接删除。
解决:
1、使用 dir命令遍历路径中文件夹。
dir /ad /tc /b /o-d 按照创建时间逆序获取当前路径下所有子文件夹
dir命令属性:
2、bat for循环计数 和 enabledelayedexpansion延迟环境变量扩展、
循环计数,很好理解,就是在循环的过程中更新计数变量。
而setlocal enabledelayedexpansion 是:设置本地为延迟扩展。其实也就是:延迟变量,全称"延迟环境变量扩展"。
在cmd执行命令前会对脚本进行预处理,其中有一个过程是变量识别过程,在这个过程中,如果有两个%括起来的如%value%类似这样的变量,就会对其进行识别,并且查找这个变量对应的值,再而将值替换掉这个变量,这个替换值的过程,就叫做变量扩展,然后再执行命令。
如果不使用变量延迟,那么在批处理命令执行循环语句中用到外部变量的时候,外部变量将使用是初始值。
3、使用 rd 命令删除文件夹
so,最终的结果:
@echo on
rem 这里设置指定路径
set softPath=%~dp0
rem 设置保留文件夹的数量
set num=10
cd /d %softPath%
rem 开启变量延迟处理
setlocal enabledelayedexpansion
set /a count=0
for /f "delims=" %%i in ('dir /ad /tc /b /o-d') do (
set /a count+=1
rem 开启变量延迟处理后在循环内使用计数变量必须要用 !变量! 获取变量 注意是英文的!
rem 另外注意 bat的比较大小的语法
if !count! GTR %num% (
rem 删除指定文件夹
rd /s /q %softPath%%%i
)
)
endlocal
echo Done!
保存成 .bat文件,并添加到定时任务中。搞定!