DOS/BAT

关注公众号 jb51net

关闭
首页 > 脚本专栏 > DOS/BAT > 定时删除指定路径下N天前的文件以及文件夹

Windows定时删除指定路径下N天前的文件以及文件夹(脚本之家修正版)

投稿:mdxy-dxy

今天在配置服务器的时候,发现备份的数据过多,硬盘严重吃紧,所以考虑定时检查当前文件夹下删除一些文件保证15天内的数据就可以了,找了很多批处理发现如下的命令不错

问:如何批处理删除文件夹及其所有子文件夹下N天前所有文件

答:下面的分析非常好,一旦文件夹里面做过任何操作,文件夹都是当前日期,所以就无法删除

当文件夹里面的某一个文件当前时间被修改过,这个文件夹的修改时间就会变成当前时间.
以删除30天以前的文件夹为例.如果一个文件夹的最后时间都是30天以前.
那么在30天以内该文件夹下的所有文件都没有被修改过.
而一个文件夹如果不在30天以前,那么也可能文件夹下的某些文件是在30天以前的.
根据这个思路.先删除30天以前的文件夹.
再删除30天以内文件夹下所有30天以前的文件.
那么就结果就如下:

forfiles -D -30 /M * /C "cmd /c rd @file /s /q"
forfiles -D -30 /S /M * /C "cmd /c del @path /s /q"

两行批处理即可搞定,具体的完整代码可以参考下面的内容

forfiles 判断文件夹

forfiles 是 Windows 命令提示符(cmd)中的一个命令,用于基于一组文件(包括文件夹)执行命令。

要使用 forfiles 来判断是否存在特定的文件夹,可以使用以下命令:

forfiles /p "C:\path" /s /d -1 /c "cmd /c if @isdir==TRUE echo Folder found: @path"

解释:

/p 参数后面跟着要搜索的路径。

/s 参数表示搜索子目录。

/d -1 表示当前日期之前的日期,因为如果找到的是文件夹,它的日期将与当前日期匹配或早于当前日期。

/c 参数后面是要执行的命令,这里是 cmd /c if @isdir==TRUE echo Folder found: @path,其中 @isdir 是一个变量,如果是文件夹则为 TRUE,如果是文件则为 FALSE。

如果需要判断特定名称的文件夹,可以修改 forfiles 命令以匹配特定的文件夹名称:

forfiles /p "C:\path" /s /m yourfoldername /c "cmd /c if @isdir==TRUE echo Folder found: @path"

在这个例子中,yourfoldername 是你要查找的文件夹名称。如果找到了匹配的文件夹,将会在命令提示符窗口中显示文件夹的路径。

将下面代码复制到自建的.txt文件里,然后保存再更改后辍名为.bat,点击执行即可

脚本文件存放随意,因为里面的路径是绝对路径

1. 删除指定路径下15天前的所有文件

@echo off
set SrcDir=E:\WORK\Git
set DaysAgo=15
forfiles /p %SrcDir% /s /m *.* /d -%DaysAgo% /c "cmd /c del /f /q /a @path"

这里的 /m . 是指路径下的所有文件,可以指定文件后辍如 *.txt

2.删除指定路径下5天前的所有文件夹

@echo off
set SrcDir=E:\WORK\Git
set DaysAgo=5
forfiles /p %SrcDir% /s /m *.* /d -%DaysAgo% /c "cmd /c rd /s /q @path"

也就是把 【del /f /q /a】换成【rd /s /q】即可

3.删除指定路径下5天前的所有文件,以及文件夹

@echo off
set SrcDir=E:\WORK\Git
set DaysAgo=5
forfiles /p %SrcDir% /s /m *.* /d -%DaysAgo% /c "cmd /c rd /s /q @path"
forfiles /p %SrcDir% /s /m *.* /d -%DaysAgo% /c "cmd /c del /f /q /a @path"

4.删除当前目录及子目录下的空文件夹

@echo off
setlocal

REM 删除当前目录下的空文件夹
for /f "delims=" %%d in ('dir /ad /s /b ^| sort /r') do (
    rmdir "%%d" 2>nul
)

REM 输出删除操作完成的提示信息
echo 删除空文件夹操作完成。

endlocal

双击运行批处理,即可删除当前目录及子目录下的空文件夹完成。

5.windows下bat脚本实现定时删除指定文件夹下的文件和文件夹

业务需求:jenkisn脚本执行日志需要定时清理,否则会影响执行结果,因此需要使用bat脚本,实现每隔一小时,定时删除文件路径为E:\ABC\DEF下的所有文件和文件夹。

1、首先新建一个del.txt文本
del /f /s /q E:\ABC\DEF\*.* cd E:\ABC\DEF rd /s /q E:\ABC\DEF cd .. md E:\ABC\DEF
升级:如果要求根据当前日期(eg:2020/12/25)创建和清除当天文件?
del /f /s /q E:\ABC\%date:~0,4%\%date:~5,2%\%date:~8,2%\*.* cd E:\ABC\%date:~0,4%\%date:~5,2%\%date:~8,2% rd /s /q E:\ABC\%date:~0,4%\%date:~5,2%\%date:~8,2% cd .. md E:\ABC\%date:~0,4%\%date:~5,2%\%date:~8,2%
2、保存,右击文件选择【重命名】,将后缀改成.bat文件
说明:这里的del命令只能删除文件,不能删文件夹。
删除文件夹使用rd命令。
del 删除文件
/f参数表示:强制删除只读文件
/s参数表示:从所有子目录删除指定文件
/q参数表示:删除全局通配符时,不提示删除确认
cd 进入文件夹目录
rd 删除文件夹
cd …/返回上级目录
md 创建文件夹

6.批处理定时删除文件夹及文件

批处理脚本可以用来定期删除指定的文件夹及其中的所有文件。以下是一个简单的批处理脚本示例,它会删除指定路径下的文件夹及其所有内容:

@echo off
setlocal
:: 设置要删除的文件夹路径
set "TARGET_DIR=C:\path\to\your\directory"
:: 确认文件夹是否存在
if exist "%TARGET_DIR%" (
rmdir /s /q "%TARGET_DIR%"
if not exist "%TARGET_DIR%" (
echo 文件夹已被删除: %TARGET_DIR%
)
) else (
echo 指定的文件夹不存在: %TARGET_DIR%
)
endlocal

请将 C:\path\to\your\directory 替换为你想要删除的文件夹的实际路径。

将以上代码保存为 .bat 文件,并双击运行或通过任务计划程序设置定时执行,以实现定时删除文件夹的目的。

7.cmd 删除制定文件架下制定日期之间的文件

@echo off
set tt=7&set ph=D:\SHLongYang_DBBK
for /f "tokens=1-3 delims=-/\:. " %%i in ("%date%") do set /a p1=%%i,p2=100%%j%%100,p3=100%%k%%100
    if %p3% gtr %TT% goto ppp
:nxt
set/a p2-=1
   if %p2% equ 0 set/a p1-=1&&set p2=12
   set/a PN2="!(p1%%4)&!(!(p1%%100))|!(p1%%400)",PN2=28+PN2
   for /f "tokens=%p2%" %%i in ("31 %pN2% 31 30 31 30 31 31 30 31 30 31") do set/a p3=%p3%+%%i
   if %p3% leq %tt% goto nxt
:ppp
set/a p3=%p3%-%tt%
setlocal enabledelayedexpansion
   for %%i in (p2 p3 t1 t2) do if !%%i! lss 10 set %%i=0!%%i!
   for /f "tokens=*" %%i in ('dir /b /s "%ph%"') do (
   set "ta=%%~ti"
   if exist "%%i\" (
   if "!ta:~0,4!!ta:~5,2!!ta:~8,2!" leq "!p1!!p2!!p3!" rd /s /q "%%i" 2>nul
   ) else if "!ta:~0,4!!ta:~5,2!!ta:~8,2!" leq "!p1!!p2!!p3!" del /a/q/f "%%i" >nul 2>nul
   )

这段大家可以参考研究一下

您可能感兴趣的文章:
阅读全文