如何通过批处理删除文件夹下的指定日期的文件

时间:2021-11-29 21:01:55
比如E区根目录有一个Backup文件夹。
这个文件夹每个星期六会产生10几个压缩包(是通过批处理写的,备份D区的数据)
由于磁盘空间有限,所以要定期删除压缩包。
能不能通过批处理写一个程序
输入指定的日期,比如:2013-09-01.
然后在这日期之前的压缩包都自动删除。
只保留9月1号以后的压缩包。
希望会的朋友指点迷津。谢谢。

21 个解决方案

#1


@for /F "delims=*" %%a in ('dir /b /a-d *.rar *.zip *.7z') do @if %%~ta lss 2013-09-01 del %%a

#2


xp以上系统有forfiles命令的话,可以直接用,没有的话,去高版本系统下拷这个命令

删除2013-09-01之前的文件(包含2013-09-01)
set /p input=输入指定的日期(如:2013-09-01): 
forfiles /p "e:\backup" /m *.rar /d -"%input%" /c "cmd /c echo 正在删除:[@file] 该文件上次修改时间:[@fdate @ftime]&& del /f @path"


或者指定N天之前,其中的
/d -"%input%"
~~~~~~~~~~~~~~~~~~~~
/d -30
表示30天之前

#3


可以在WIN2003系统里拷贝吗?如果可以,那个命令是在哪的?该拷到XP系统哪个位置?

#4


系统是WIN XP的!

#5


2003系统有,在系统system32目录下

#6


set SrcDir=E:\software
set DaysAgo=7
forfiles /p %SrcDir% /s /m *.* /d-%DaysAgo% /c "cmd /c del/f/q/a @path"
pause

我这样写命令,您看对吗?怎么双击BAT文件,没反应,我想删除7天前E区software里的文件。

#7


set SrcDir=E:\software
set DaysAgo=7
forfiles /p "%SrcDir%" /d -%DaysAgo% /c "cmd /c echo 正在删除:[@file] 该文件上次修改时间:[@fdate @ftime] && del /f @path"

#8


呵呵,我研究好了,原来是这样
set SrcDir=E:\software
set DaysAgo=7
forfiles /p %SrcDir% /s /m *.* /d -%DaysAgo% /c "cmd /c del /f /q /a @path"


我还有一个问题,这个批处理,只是删除E区下SOFTWARE文件夹里的文件,并不删除里面的文件夹,如果想文件夹都删除,怎么写?

#9


forfiles /p ....
~~~~~~~~~~~~~~~~~~~~~~~~~
forfiles /s /p ....

#10


我搞错了,是要删除目录,后面再加 && rd /s /q @path就好了

forfiles /p %SrcDir% /s /d -%DaysAgo% /c "cmd /c del /f /q /a @path  && rd /s /q @path"

#11


加上你那句话,双击BAT文件,就一直提示“系统找不到指定的文件”。我的SOFTWARE文件夹里是有几个文件夹,都是7天前的。请问何解?

#12


不用管它的,&& 这个是依次执行两条命令,其中一条命令可能执行不成功,但不影响结果

我这里测试,文件夹、文件都可以删除

#13


好的,谢谢你。

#14


对了,你知道命令末尾为什么一定要加@path吗?

#15


@path是forfiles命令中/c 参数变量

默认命令是 "cmd /c echo @file"。下列变量
可以用在命令字符串中:
@file    - 返回文件名。
@fname   - 返回不带扩展名的文件名。
@ext     - 只返回文件的扩展。
@path    - 返回文件的完整路径。
@relpath - 返回文件的相对路径。
@isdir   - 如果文件类型是目录,返回 "TRUE";如果是文件,返回 "FALSE"。
@fsize   - 以字节为单位返回文件大小。
@fdate   - 返回文件上一次修改的日期。
@ftime   - 返回文件上一次修改的时间。

#16


我把WIN7(32位)里的forfiles,放到XP(32位)里的system32里,双击批处理提示不是有效的WIN32应用程序哦。

#17


搞后了,拿win2003的forfiles即可。

#18


引用 15 楼 gxgyj 的回复:
@path是forfiles命令中/c 参数变量

默认命令是 "cmd /c echo @file"。下列变量
可以用在命令字符串中:
@file    - 返回文件名。
@fname   - 返回不带扩展名的文件名。
@ext     - 只返回文件的扩展。
@path    - 返回文件的完整路径。
@relpath - 返回文件的相对路径。
@isdir   - 如果文件类型是目录,返回 "TRUE";如果是文件,返回 "FALSE"。
@fsize   - 以字节为单位返回文件大小。
@fdate   - 返回文件上一次修改的日期。
@ftime   - 返回文件上一次修改的时间。


可不可以再这段程序的基础上加一个判断条件,但该分区的剩余容量小于10G时,才执行以下命令:
set SrcDir=E:\software
set DaysAgo=7
forfiles /p %SrcDir% /s /m *.* /d -%DaysAgo% /c "cmd /c del /f /q /a @path"
你懂吗?

#19


@echo off
set vol=E
for /f "tokens=2* delims=:" %%a in ('fsutil volume diskfree %vol%:') do set free=%%a
set free=%free:~0,-6%
echo %free%
if %free% lss 10000 echo 这个逻辑盘空间不足10G

#20


引用 19 楼 gxgyj 的回复:
@echo off
set vol=E
for /f "tokens=2* delims=:" %%a in ('fsutil volume diskfree %vol%:') do set free=%%a
set free=%free:~0,-6%
echo %free%
if %free% lss 10000 echo 这个逻辑盘空间不足10G
可以解释下吗?感激不尽。

#21


引用 19 楼 gxgyj 的回复:
@echo off
set vol=E
for /f "tokens=2* delims=:" %%a in ('fsutil volume diskfree %vol%:') do set free=%%a
set free=%free:~0,-6%
echo %free%
if %free% lss 10000 echo 这个逻辑盘空间不足10G

我网上查了一些资料,明白了一些。不过还有几点不明白
1."tokens=2* delims=:"这个分割的地方我看不懂,2*是不是指E区的所有空间?:呢?
2.%free:~0,-6%这句语法应该怎么理解?网上都找不到相关解释。谢谢。

#1


@for /F "delims=*" %%a in ('dir /b /a-d *.rar *.zip *.7z') do @if %%~ta lss 2013-09-01 del %%a

#2


xp以上系统有forfiles命令的话,可以直接用,没有的话,去高版本系统下拷这个命令

删除2013-09-01之前的文件(包含2013-09-01)
set /p input=输入指定的日期(如:2013-09-01): 
forfiles /p "e:\backup" /m *.rar /d -"%input%" /c "cmd /c echo 正在删除:[@file] 该文件上次修改时间:[@fdate @ftime]&& del /f @path"


或者指定N天之前,其中的
/d -"%input%"
~~~~~~~~~~~~~~~~~~~~
/d -30
表示30天之前

#3


可以在WIN2003系统里拷贝吗?如果可以,那个命令是在哪的?该拷到XP系统哪个位置?

#4


系统是WIN XP的!

#5


2003系统有,在系统system32目录下

#6


set SrcDir=E:\software
set DaysAgo=7
forfiles /p %SrcDir% /s /m *.* /d-%DaysAgo% /c "cmd /c del/f/q/a @path"
pause

我这样写命令,您看对吗?怎么双击BAT文件,没反应,我想删除7天前E区software里的文件。

#7


set SrcDir=E:\software
set DaysAgo=7
forfiles /p "%SrcDir%" /d -%DaysAgo% /c "cmd /c echo 正在删除:[@file] 该文件上次修改时间:[@fdate @ftime] && del /f @path"

#8


呵呵,我研究好了,原来是这样
set SrcDir=E:\software
set DaysAgo=7
forfiles /p %SrcDir% /s /m *.* /d -%DaysAgo% /c "cmd /c del /f /q /a @path"


我还有一个问题,这个批处理,只是删除E区下SOFTWARE文件夹里的文件,并不删除里面的文件夹,如果想文件夹都删除,怎么写?

#9


forfiles /p ....
~~~~~~~~~~~~~~~~~~~~~~~~~
forfiles /s /p ....

#10


我搞错了,是要删除目录,后面再加 && rd /s /q @path就好了

forfiles /p %SrcDir% /s /d -%DaysAgo% /c "cmd /c del /f /q /a @path  && rd /s /q @path"

#11


加上你那句话,双击BAT文件,就一直提示“系统找不到指定的文件”。我的SOFTWARE文件夹里是有几个文件夹,都是7天前的。请问何解?

#12


不用管它的,&& 这个是依次执行两条命令,其中一条命令可能执行不成功,但不影响结果

我这里测试,文件夹、文件都可以删除

#13


好的,谢谢你。

#14


对了,你知道命令末尾为什么一定要加@path吗?

#15


@path是forfiles命令中/c 参数变量

默认命令是 "cmd /c echo @file"。下列变量
可以用在命令字符串中:
@file    - 返回文件名。
@fname   - 返回不带扩展名的文件名。
@ext     - 只返回文件的扩展。
@path    - 返回文件的完整路径。
@relpath - 返回文件的相对路径。
@isdir   - 如果文件类型是目录,返回 "TRUE";如果是文件,返回 "FALSE"。
@fsize   - 以字节为单位返回文件大小。
@fdate   - 返回文件上一次修改的日期。
@ftime   - 返回文件上一次修改的时间。

#16


我把WIN7(32位)里的forfiles,放到XP(32位)里的system32里,双击批处理提示不是有效的WIN32应用程序哦。

#17


搞后了,拿win2003的forfiles即可。

#18


引用 15 楼 gxgyj 的回复:
@path是forfiles命令中/c 参数变量

默认命令是 "cmd /c echo @file"。下列变量
可以用在命令字符串中:
@file    - 返回文件名。
@fname   - 返回不带扩展名的文件名。
@ext     - 只返回文件的扩展。
@path    - 返回文件的完整路径。
@relpath - 返回文件的相对路径。
@isdir   - 如果文件类型是目录,返回 "TRUE";如果是文件,返回 "FALSE"。
@fsize   - 以字节为单位返回文件大小。
@fdate   - 返回文件上一次修改的日期。
@ftime   - 返回文件上一次修改的时间。


可不可以再这段程序的基础上加一个判断条件,但该分区的剩余容量小于10G时,才执行以下命令:
set SrcDir=E:\software
set DaysAgo=7
forfiles /p %SrcDir% /s /m *.* /d -%DaysAgo% /c "cmd /c del /f /q /a @path"
你懂吗?

#19


@echo off
set vol=E
for /f "tokens=2* delims=:" %%a in ('fsutil volume diskfree %vol%:') do set free=%%a
set free=%free:~0,-6%
echo %free%
if %free% lss 10000 echo 这个逻辑盘空间不足10G

#20


引用 19 楼 gxgyj 的回复:
@echo off
set vol=E
for /f "tokens=2* delims=:" %%a in ('fsutil volume diskfree %vol%:') do set free=%%a
set free=%free:~0,-6%
echo %free%
if %free% lss 10000 echo 这个逻辑盘空间不足10G
可以解释下吗?感激不尽。

#21


引用 19 楼 gxgyj 的回复:
@echo off
set vol=E
for /f "tokens=2* delims=:" %%a in ('fsutil volume diskfree %vol%:') do set free=%%a
set free=%free:~0,-6%
echo %free%
if %free% lss 10000 echo 这个逻辑盘空间不足10G

我网上查了一些资料,明白了一些。不过还有几点不明白
1."tokens=2* delims=:"这个分割的地方我看不懂,2*是不是指E区的所有空间?:呢?
2.%free:~0,-6%这句语法应该怎么理解?网上都找不到相关解释。谢谢。