目录
一、bat文件编写脚本
二、使用定时任务执行
三、定时任务执行脚本不成功处理方法
四、讲解脚本
总结
遗留的问题
一、bat文件编写脚本
注:脚本使用命令行窗口执行,在powershell中会出问题
删除5天前文件脚本
注:也可指定删除月、周、分钟输入
schtasks /create /?查看文档
注:删除文件脚本, 可以指定文件类型和删除几天之前的数据
注:内容已测试。
REM -5指保留5天以内修改的文件,5天之前的数据进行删除
REM 如当前时间为2024-03-21日, 保留21,20,19,18,17号数据, 则16,15,...之前的数据进行删除
REM cmd命令行可使用forfiles /?查看参数帮助说明。
REM /p 指定轮询目录的起始位置
REM /s 递归子目录查找
REM /m 匹配规则, 如*.*匹配所有类型的文件, 若使用 * 则会将文件夹进行了匹配
REM /d 匹配的时间,0:查询24小时内的数据,-1:查询1天前的数据,-7:查询7天前的数据
REM /c 执行命令。@path:输出查询到的文件或文件夹的绝对路径,如f:\xx\xx\file.txt
@echo off
setlocal enabledelayedexpansion
set beforeday=-5
forfiles /p f:\xx\xx /s /m *.* /d %beforeday% 2>nul /c "cmd /c del /s /q @path"
endlocal
注:特别说一下命令中的
2>nul
可以忽略forfiles命令在搜索文件时异常日志打印
二、使用定时任务执行
注:命令行创建定时任务
注:/ru 指定的用户可以更换,如Administrator
schtasks /create /tn "del" /tr "F:\xx\xx\for.bat" /sc MINUTE /ru SYSTEM
注:创建定时任务后,将脚本进行修改,仍旧可以生效
三、定时任务执行脚本不成功处理方法
1. 解释
注:原因是当前登录的系统用户没有加入到administrators用户组。因为该用户组有执行批处理的权限
注:也就是将下方图片中显示的【定时任务执行用户】加入到administrator用户组
2. 添加到用户组的操作方法
注:操作方法。
命令行输入compmgmt.msc 回车
四、讲解脚本
注:dir /b /a-d | findstr /v /x "."
/b # 输出基本信息,如文件名 brief
/a # 输出属性 attribute
-d # 不包含目录 directory
总结
1. 吐槽
使用 [》》](https://blog.csdn.net/dafei5210/article/details/113460413?spm=1001.2014.3001.5506) 此链接测试发现删除文件可行,但是删除文件夹不起作用。
有可能是参数有问题
2. 不一样的系统环境执行后效果不同
注:下图是在
windows server 2016 上执行后的命令窗口截图, 卡在哪里。但在本机电脑win11专业版不会发生这样的问题
注:这个问题还没有得到解决。目前手动关闭就可以了。
3. 还可删除多个文件夹中的内容
4. 也可使用powershell
也可使用powershell脚本进行操作。但时间有限,这里只做cmd命令行的操作,后期如果有机会优化会更新此篇文章
5. 方便的操作
注:停掉定时任务. 找到定时任务名称使用/change方式禁用即可
schtasks /change /tn rmfile /DISABLE
遗留的问题
注:此脚本是删除空文件夹
问题:errorlevel 变量即使在文件夹是空的 也一直是0(0:命令执行成功,非0:失败)
有哪位高手、大神如果有幸能够知道问题所在,给我留言吧
@echo off
setlocal enabledelayedexpansion
set "folder=E:\2024-02-28"
set "daysAgo=0"
rem 检查目录是否存在
if not exist "%folder%\" (
echo Folder does not exist.
exit /b 1
)
rem 查找修改时间早于7天前的目录,并检查是否为空,然后删除
for /f "delims=" %%D in ('forfiles /p "%folder%" /s /d -%daysAgo% /c "cmd /c if @isdir==TRUE echo @path"') do (
rem 初始化一个标志,用于标记目录是否为空
set "isEmpty=true"
echo %%D
rem 检查文件夹中是否有文件或子目录
dir /b /a /s "%%D" | findstr /v /x "." >nul
if errorlevel 0 (
rem 如果找到了文件或子目录,则将标志设置为false
set "isEmpty=false"
)
echo !isEmpty!
if "!isEmpty!"=="true" (
echo Deleting empty folder: %%D
)
)
echo All empty folders modified more than %daysAgo% days ago have been deleted.
endlocal