Board logo

标题: 求问“关于定期清理文件夹的bat”(等待中第2天了) [打印本页]

作者: sj2009     时间: 2009-12-15 14:46    标题: 求问“关于定期清理文件夹的bat”(等待中第2天了)

想做一个计划任务,定期1个月清理d:\视频录像的资料。
但不知道如何写这样的BAT文件,请好心人帮助。

[ Last edited by sj2009 on 2009-12-16 at 16:56 ]
作者: Hanyeguxing     时间: 2009-12-15 15:12
你要怎么清理呢?
如果是要每个月的这一天删除d根目录下(不含子目录)所有mpg文件,则可以:
for /f "tokens=3 delims=-:/ " %%i in ("%date%") do schtasks /create /tn "Hanyeguxing" /tr "cmd /c del d:\*.mpg /f /q /a" /sc monthly /d %%i
[ Last edited by Hanyeguxing on 2009-12-15 at 15:25 ]
作者: hanxiaofeng888     时间: 2009-12-15 22:14
如果只做BAT让它每个月清理文件,那这个BAT必须一直开着
你可以这样。把下面的代码保存为BAT,把它添加到计划任务里,让它每个月启动一回就可以了  这样是不是很简短 呵呵
del /q d:\视频录像的资料\*.*
上面的只能删除d:\视频录像的资料\下的所有文件,不能删除文件夹和子目录下的文件
del /q /s d:\视频录像的资料\*.*
删除d:\视频录像的资料\下的所有文件和子目录下的所有文件,不能删除文件夹
作者: sj2009     时间: 2009-12-16 09:05
回2楼达人,我表达的不够准确,不好意思啦。
其实我想写的BAT文件,是为做一个计划任务,
定期1个月清理d:\视频录像的资料\*.*的视频文件,
就好比现在是2009.12月,我要清理前面10月和11月的视频文件,麻烦你再写下
作者: sj2009     时间: 2009-12-16 09:06
3楼的兄弟也多谢啦
作者: sj2009     时间: 2009-12-16 12:56
继续求解
作者: qinchun36     时间: 2009-12-16 16:02
请先右键看一下你那些文件的属性

你要清理的依据是 “创建时间”  还是 “修改时间

如果是后者的话可以帮你搞一下,前者如果用bat的话必须调用WMIC,太麻烦了我写不来。。。
作者: sj2009     时间: 2009-12-16 16:04
回LS,清理的依据是 “创建时间”
作者: sj2009     时间: 2009-12-16 16:05
请教如何清理以日期命名的文件夹

其实我想写的BAT文件,是为做一个计划任务,
定期2个月清理d:\视频录像的资料\20091201\目录下的视频文件,
20091201是以日期命名的文件夹,
就好比现在是2009.12月,我要清理前面10月和11月的视频文件
作者: sj2009     时间: 2009-12-16 16:14
http://www.cn-dos.net/forum/view ... E4%BB%B6&page=1

这里我也看过了,可是自己无法解决
作者: qinchun36     时间: 2009-12-16 17:11
靠,累死我了,给你写了一个,先别忙着运行,给你说明下先。

1、不要重复发帖,这种行为是很被鄙视的。

2、每次只能搞一个文件夹,因此每次要设置,改这个代码,通配符会吧,像
        set files=d:\视频录像的资料\20091201\*.*
     这样的,或者改成 *.rmvb

3、记住这个处理的是『创建日期』,请仔细理解。

4、先确认你机器安装了WMIC,具体做法是在命令行窗口中执行 wmic  
     安装之后才能运行这个批处理。
@echo off
:: 设置要处理几个月之内的(不包括这个月)
:: 小于 12 ,不然我没测试是否出错
set /a n=2
:: 设置要处理的文件的通配符表示(只能每次处理一个文件夹的)
set files=d:\视频录像的资料\20091201\*.*

color 17
title (C)2009 qinchun36 『据说是李先生』
setlocal enabledelayedexpansion

:init
set /a tty=%date:~0,4%
set /a ttm=%date:~5,2%
if %ttm% leq %n% (
        set /a tsy=!tty!-1
        set /a tsm=12+!ttm!-!n!
        if !tsm! lss 10 set tsm=0!tsm!
        set /a tsym=!tsy!!tsm!
) else (
        set /a tsym=%date:~0,4%%date:~5,2%-!n!
)
set /a ts=!tsym!00
set /a te=%date:~0,4%%date:~5,2%00
echo.
echo   将要删除符合 『%files%』 的,
echo.
echo   『创建日期』在 %ts% 和 %te% 之间的文件!
echo.
set /p ching=是否继续?^(Y/N^)  
if /i "!ching!"=="Y" goto process
exit


:process
echo.
echo =====================================================
for %%i in (%files%) do (
        set f=%%~si
        set fw=!f:\=\\!
        for /f "skip=1 delims=." %%a in ('wmic datafile where name^='!fw!' get CreationDate') do set a=%%a
        set /a ta=!a:~0,8!
        if !ta! lss !te! (
                if !ta! gtr !ts! (
                        echo 删除 !ta! !f!
                        del !f! /f /q
                )
        )
)
echo =====================================================
echo.
echo 处理完毕。
pause>nul
exit

作者: Hanyeguxing     时间: 2009-12-16 19:14
首先,类似于多长时间运行一次批处理等,在任务计划中设置.

在任务计划中运行这个批处理:
for /f "skip=5 tokens=1,2,3,4,5,7* delims=-:/ " %%i in ('dir "路径" /a:-d /t:c') do if not "%%m" == "" if "%%i%%j%%k%%l%%m" gtr "时间1" if "%%i%%j%%k%%l%%m" lss "时间2" @del "路径\%%n%%o" /a /f /q>nul 2>nul
其中:
1,路径是指要操作的目录,例如d:\视频录像的资料
2,时间是比较时间,例如以2009年10月12日09时13分为分隔点,则写成200910120913,其中:时间1是时间段的开始,时间2是时间段的结束,本批处理将删除这个时间段之间创建的所有文件
3,本批处理每次仅能处理一个目录(文件夹),且不处理其子目录(文件夹)
4,本批处理依赖dir的输出格式,所以运行前请测试dir命令输出,是否符合本批处理要求。在cmd 中运行 dir "路径" /a:-d /t:c
看输出是否下面示例样子。

驱动器 C 中的卷没有标签。
卷的序列号是 303A-5C0B

C:\Documents and Settings\寒夜孤星 的目录

2009-10-12  09:13         2,883,584 NTUSER.DAT
2009-10-12  09:13            24,576 ntuser.dat.LOG
2009-10-12  09:13               178 ntuser.ini
2009-10-12  21:48               976 ntuser.pol
               4 个文件      2,909,314 字节
               0 个目录 12,642,504,704 可用字节


如果只删除某个时间点之前的文件,则可以这样写:
for /f "skip=5 tokens=1,2,3,4,5,7* delims=-:/ " %%i in ('dir "路径" /a:-d /t:c') do if not "%%m" == "" if "%%i%%j%%k%%l%%m" lss "时间" @del "路径\%%n%%o" /a /f /q>nul 2>nul
[ Last edited by Hanyeguxing on 2009-12-16 at 19:54 ]
作者: Hanyeguxing     时间: 2009-12-16 20:39
如果要删除前几个月的文件,则可以这样写:
@echo off&setlocal enabledelayedexpansion
set n=5
for /f "tokens=1,2 delims=-:/ " %%a in ("%date%") do (set a1=%%a&set a2=%%a&set b=%%b
if "%%b" lss "10" set b=!b:~1,1!)
set/a b1=%b%-%n%&set/a b2=%b%-1
if %b2% leq 0 set/a a2=%a2%-1&set/a b2=12
if %b2% leq 9 set b2=0%b2%
if %b1% leq 0 set/a a1=%a1%-1&set/a b1=12+%b1%
if %b1% leq 9 set b1=0%b1%
for /f "skip=5 tokens=1,2,3,4,5,7* delims=-:/ " %%i in ('dir "路径" /a:-d /t:c') do if not "%%m" == "" if "%%i%%j" geq "%b1%" if "%%i%%j" leq "%b2%" @del "路径\%%n%%o" /a /f /q>nul 2>nul
其中set n=设置月份的长度,例如,当前为12月,要删除前5个月份的文件,则设置set n=5,即检查的月份为07月,08月,09月,10月,11月。
注意,n必须为1到12之间的数字。

[ Last edited by Hanyeguxing on 2009-12-16 at 20:59 ]
作者: hanxiaofeng888     时间: 2009-12-16 20:59
楼上的 厉害 运用的如此巧妙和精简   学习了
作者: sj2009     时间: 2009-12-17 08:51
非常感谢:qinchun36和Hanyeguxing;
我会认真学习
作者: sj2009     时间: 2009-12-17 11:47
研究了很久,还是不行。
如果只删除某个时间点之前的文件,则可以这样写:
CODE:  [Copy to clipboard]
--------------------------------------------------------------------------------

for /f "skip=5 tokens=1,2,3,4,5,7* delims=-:/ " %%i in ('dir "路径" /a:-d /t:c') do if not "%%m" == "" if "%%i%%j%%k%%l%%m" lss "时间" @del "路径\%%n%%o" /a /f /q>nul 2>nul
作者: Hanyeguxing     时间: 2009-12-17 12:45

@echo off
set a=d:\视频录像的资料
set t=201009021501
for /f "skip=5 tokens=1,2,3,4,5,7* delims=-:/ " %%i in ('dir "%a%" /a:-d /t:c') do if not "%%m" == "" if "%%i%%j%%k%%l%%m" lss "%t%" echo "%a%\%%n%%o"
echo 测试目录为%a%
echo 分隔时间为%t:~0,4%年%t:~4,2%月%t:~6,2%日%t:~8,2%时%t:~10,2%分
pause>nul
“d:\视频录像的资料”为要检查的目录。时间点设置为2010年09月02日15时01分
用这个来测试。列表中没有显示该文件夹中的所有文件吗?你把显示的结果贴图出来。
具体说一下,怎么不行?

[ Last edited by Hanyeguxing on 2009-12-17 at 12:56 ]