Board logo

标题: 一个关于数据删除的问题请教. [打印本页]

作者: fzp1978321     时间: 2008-2-1 21:05    标题: 一个关于数据删除的问题请教.
在D:\下,如何在下一周的周一,删除上周周一所生成的文件(包含该路径下各级文件夹下上周一所生成的文件,前提是各级文件夹不被删除)? 我知道用 DEL /S/Q/F 可以清空该路径下的所有文件,但是我又如何实现清除指定时间的文件呢? 我是做了个计划任务,每周的某天删除上周对应某天的数据(如下周一时删除上周一的文件,下周二删除上周二的文件),其他数据不动. 在这个问题上面卡住了,希望得到解答.

作者: fzp1978321     时间: 2008-2-1 21:38
没人能解答么?

作者: slore     时间: 2008-2-1 22:01
时间是文件名有规律?还是创建时间?

作者: fzp1978321     时间: 2008-2-1 22:08
文件名不规律,因为每天生成文件的个数和多少并不固定,所以是根据创建时间来进行删除. 哎,简直拿它没招了,呵呵. 另,系统是WIN2000 [ Last edited by fzp1978321 on 2008-2-1 at 10:21 PM ]

作者: fzp1978321     时间: 2008-2-1 23:03
这个问题真的就那么难?!盼高手解答.

作者: slore     时间: 2008-2-1 23:09
for中的%~tI得到的是修改时间。。。 DIR可以得到 创建时间,但是。。。路径不能写完整路径。。 如果dir一边,在把文件一个个的dir一边……可以。。。 但是你整个D盘。。。处理起来。。。。 记得论坛原来有人做个类似找不到了。。。。 难不难,感觉写的代码复杂。以前没处理过时间的……也觉得处理时间麻烦。

作者: fzp1978321     时间: 2008-2-1 23:40
在这我说明下,我说的D:其实是个映射的文件夹,里边有许多文件和目录,目录内又有些子目录. 其实我备份已经做出来了,每天生成的数据按照原来的路径格式压缩后不超过30M. 其实我觉得把每天生成的文件都备份了其实就行了,然后一周删除一次源路径下的源文件;但是又被要求必须是像在下一周的周一才能删除上一个周一的数据这样的方式来删除文件.我觉得这样很多余,并且很很无奈. 所以才在这上面寻求帮助.

作者: slore     时间: 2008-2-2 02:22
作者: slore     时间: 2008-2-2 02:23
如果是修改日期的就用这个就行了。貌似%%~tI得到的是修改日期。 如果你的文件的创建日期和修改一样,按那个上面的代码就行了。 如果不一样再说吧~ 肯定是可以,就是觉得麻烦。:(

作者: fzp1978321     时间: 2008-2-3 01:15
谢谢SLORE的帮助. 那个帖子我看了,好象是在WINXP下的,在WIN2000XIA能用么? 还有,里边我发现有两个程序,该用哪一个?

作者: terse     时间: 2008-2-3 14:16
删除任意天数文件 环境 XP 试一下可以否 @echo off SET/p TT=天数: SET/p PH=路径: set p1=%date:~0,4% set p2=%date:~5,2% set p3=%date:~8,2% setlocal enabledelayedexpansion for /l %%a in (1,1,3) do ( for /f "delims=0 tokens=*" %%i in ("!p%%a!") do set p%%a=%%i ) if %p3% gtr %TT% set/a p3=%p3%-%tt%&& goto ppp :nxt set/a p2-=1 if %p2% equ 0 set/a p1-=1&&set p2=12 SET/a PN1=%p1%%%4 set PN2=28 if %PN1% EQU 0 set pN2=29 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 set/a p3=%p3%-%tt% :ppp set p2=0%p2% set p2=%p2:~-2,2% set p3=0%p3% set p3=%p3:~-2,2% for %%i in ("%PH%\*") do set t=%%~ti &&call :loop "%%~fi" pause goto :eof :loop if not "%~1" == "%~f0" ( IF %p1%%p2%%p3% equ %t:~0,4%%t:~5,2%%t:~8,2% del "%~1" /S/Q/F ) ::抱歉 漏一标签 [ Last edited by terse on 2008-2-4 at 03:10 AM ]

作者: fzp1978321     时间: 2008-2-3 19:48
我在XP上运行了下,是删除C:\1002里7天前的文件,在CMD.EXE如下显示: 7: C:\1002 'NEX'不是内部或外部命令,也不是可运行的程序 或批处理文件 找不到操作数 20080133 (以上每一行都需要按任意键才逐行显示的) 在CMD.EXE显示完后,我再安任意键,会弹出个名为"CMD.TXT"的文本文件,内容如下: bugreport.qq.comToolVer=1.0&AppName=QQ&AppBuild=17290440&ErrAdd=03d540a8&OSId=00000002&OSMajVer=00000005&OSMinVer=00000001&OSBuildNo=00000A28&UIN=195690504&CrashInfo=1h%2FTuhJl4flo4g4Cnqbt%2BTdEOTQ1NjQ3&cmd=1&UserDescription= 这是什么意思啊,看不明白.

作者: fzp1978321     时间: 2008-2-3 21:48
这个问题有点急,希望能有人能完整详细的帮我下,谢谢!

作者: fastslz     时间: 2008-2-3 22:04
回头我到win2000下写个代码给你

作者: fzp1978321     时间: 2008-2-3 22:06
谢谢

作者: fastslz     时间: 2008-2-4 00:00
@echo off
call :转换日期格式

>tmp.vbs echo Wscript.echo FormatDateTime (DateAdd("d",-7,Date),2)
for /f "delims=" %%i in ('cscript.exe //nologo tmp.vbs') do set aDate=%%i
del tmp.vbs
set aDate=%aDate:~2%
setlocal EnableDelayedExpansion
for /f "delims=" %%i in ('dir/s/b/a-d xxx\*.*') do (
    set fileDate=%%~ti
    set fileDate=!fileDate:~0,-7!
    if !fileDate:-=! LSS %aDate:-=% del /q/f "%%i"
)
pause
exit

:转换日期格式
>aDate.reg echo REGEDIT4
>>aDate.reg echo.
>>aDate.reg echo [HKEY_CURRENT_USER\Control Panel\International]
>>aDate.reg echo "sShortDate"="yyyy-MM-dd"
regedit /s aDate.reg
del aDate.reg
goto:eof

作者: fzp1978321     时间: 2008-2-4 00:11
太感谢了! 不过有个不情之请,能大概解释下这些代码么? 我看的不是很懂. 真的很谢谢你!

作者: fzp1978321     时间: 2008-2-4 00:12
这个不会把目录结构也给删了吧,只是删一周前某一天的文件,是么?

作者: fastslz     时间: 2008-2-4 00:22
转换日期格式为2008-01-01 用vbs获取当前日期-7天的日期为aDate变量(如果上面没有转换vbs获取日期格式是2008-1-1) 最后一个for不必解释了,把 if !fileDate:-=! LSS %aDate:-=% del /q/f "%%i" 换成 echo if !fileDate:-=! LSS %aDate:-=% del /q/f "%%i" 就一目了然了 代码运行过一次call :转换日期格式 及下面一部分可以去掉了

作者: fastslz     时间: 2008-2-4 00:24
Originally posted by fzp1978321 at 2008-2-4 00:12: 这个不会把目录结构也给删了吧,只是删一周前某一天的文件,是么?
是的

作者: fzp1978321     时间: 2008-2-4 00:28
你真的很强大,呵呵. 明天我去WIN2000上试下.非常感谢! 有问题我会及时反馈. 那这个批处理是放在那个目录下就OK么?我想把它做成计划任务,每天定时运行. [ Last edited by fzp1978321 on 2008-2-4 at 12:30 AM ]

作者: fzp1978321     时间: 2008-2-4 00:44
如果文件的日期格式就只是如2008-1-1,2008-1-11,那就不需要进行转换,那代码如何改呢?

作者: slore     时间: 2008-2-4 00:45
set fileDate=%%~ti 是修改日期吧。因为不是创建日期一直没有写。。。

作者: fastslz     时间: 2008-2-4 01:16
这个2000 XP通用的,且修改时间后再还原,保持系统默认状态
@echo off
regedit /e "%temp%\bak.reg" "HKEY_CURRENT_USER\Control Panel\International"
call :DateFormat

>tmp.vbs echo Wscript.echo FormatDateTime (DateAdd("d",-7,Date),2)
for /f "delims=" %%i in ('cscript.exe //nologo tmp.vbs') do set aDate=%%i
del tmp.vbs
ver|find "2000">nul&&set aDate=%aDate:~2%
set aDate=%aDate:-=%
setlocal EnableDelayedExpansion
for /f "delims=" %%i in ('dir/s/b/a-d xxx\*.*') do (
    set fileDate=%%~ti
    set fileDate=!fileDate:~0,-6!
    set fileDate=!fileDate:-=!
    if !fileDate! LSS %aDate%  del /q/f "%%i"
)
regedit /s "%temp%\bak.reg"
del /q "%temp%\bak.reg"
pause
exit

:DateFormat
>aDate.reg echo REGEDIT4
>>aDate.reg echo.
>>aDate.reg echo [HKEY_CURRENT_USER\Control Panel\International]
>>aDate.reg echo "sShortDate"="yyyy-MM-dd"
>>aDate.reg echo "sDate"="-"
regedit /s aDate.reg
del aDate.reg
goto:eof
[ Last edited by fastslz on 2008-2-4 at 02:28 AM ]

作者: fzp1978321     时间: 2008-2-4 01:20
那比如我要删除D:\FTPSERVER内7天前生成的所有文件,我是不是将这个批处理放在D:\FTPSERVER这个目录中,然后做个计划任务就行了呢?不会7天后把自己给删掉吧? 想确认下这问题

作者: fastslz     时间: 2008-2-4 01:25
Originally posted by slore at 2008-2-4 00:45: set fileDate=%%~ti 是修改日期吧。因为不是创建日期一直没有写。。。
是的 如果那样的,楼主要创建时间的话通过call 标签dir /tc获得,但是理论上每7天删除的话修改时间也是可行的

作者: fastslz     时间: 2008-2-4 01:28
Originally posted by fzp1978321 at 2008-2-4 01:20: 那比如我要删除D:\FTPSERVER内7天前生成的所有文件,我是不是将这个批处理放在D:\FTPSERVER这个目录中,然后做个计划任务就行了呢?不会7天后把自己给删掉吧? 想确认下这问题
('dir/s/b/a-d xxx\*.*^|find /v /i ".bat"') 排除.bat文件

作者: fzp1978321     时间: 2008-2-4 01:31
长见识了,差距还真不是一年两年的啊... 去2000下测试成功后,明天过来结贴. 非常感谢!

作者: fzp1978321     时间: 2008-2-4 01:44
好象我很麻烦 刚才试着在XP下运行了下,报错. "系统找不到指定的批处理标签转换日期格式 "此时不应有-!"

作者: fastslz     时间: 2008-2-4 01:55
不可能呀,我都是在XP和2000 pro下测试的 莫非你的cmd代码页修改过,或者某部分多了个空格 改成英文标签 call :xxx :xxx

作者: fzp1978321     时间: 2008-2-4 01:56
真奇了怪了 我再试

作者: fzp1978321     时间: 2008-2-4 01:58
我是把你的代码粘贴到TXT里,然后修改属性成BAT,这样没错吧?

作者: fastslz     时间: 2008-2-4 02:02
你是管理员权限用户吗? XP系统是不是精简版的ghostxp? 命令提示符下cscript.exe /?有该命令吗?

作者: fzp1978321     时间: 2008-2-4 02:06
是管理员权限用户 不是精简版的 有cscript.exe 命令

作者: fastslz     时间: 2008-2-4 02:11
那出现 "此时不应有-!"是因为路径没有选对,或者该目录是空目录,代码没作这样的排错处理

作者: fzp1978321     时间: 2008-2-4 02:13
可是我放的那个目录里边是有文件和其他目录的啊,晕,简直不懂了 今天真麻烦你了

作者: fastslz     时间: 2008-2-4 02:32
知道什么原因了,我贪图代码简洁少了2个转换步骤,也奇怪2000不会出现xp反而出现这样的情况 @echo off regedit /e "%temp%\bak.reg" "HKEY_CURRENT_USER\Control Panel\International" call :DateFormat >tmp.vbs echo Wscript.echo FormatDateTime (DateAdd("d",-7,Date),2) for /f "delims=" %%i in ('cscript.exe //nologo tmp.vbs') do set aDate=%%i del tmp.vbs ver|find "2000">nul&&set aDate=%aDate:~2% set aDate=%aDate:-=% setlocal EnableDelayedExpansion for /f "delims=" %%i in ('dir/s/b/a-d xxx\*.*') do ( set fileDate=%%~ti set fileDate=!fileDate:~0,-6! set fileDate=!fileDate:-=! if !fileDate! LSS %aDate% del /q/f "%%i" ) regedit /s "%temp%\bak.reg" del /q "%temp%\bak.reg" pause exit :DateFormat >aDate.reg echo REGEDIT4 >>aDate.reg echo. >>aDate.reg echo [HKEY_CURRENT_USER\Control Panel\International] >>aDate.reg echo "sShortDate"="yyyy-MM-dd" >>aDate.reg echo "sDate"="-" regedit /s aDate.reg del aDate.reg goto:eof

作者: fzp1978321     时间: 2008-2-4 02:39
这个问题是解决了 我把机器时间定在2008-1-9日,删2008-1-2的文件,报"系统找不到指定的文件"

作者: fastslz     时间: 2008-2-4 02:50
系统找不到指定的文件 是('dir/s/b/a-d xxx\*.*')无效路局才出现的 正确方法是('dir/s/b/a-d "D:\FTPSERVER\*.*"') 哎~你也应该掌握点相关知识呀 有问题明天继续吧

作者: fzp1978321     时间: 2008-2-4 02:52
嘿,谢谢了 晚安

作者: terse     时间: 2008-2-4 03:00
Originally posted by fzp1978321 at 2008-2-3 19:48: 我在XP上运行了下,是删除C:\1002里7天前的文件,在CMD.EXE如下显示: 7: C:\1002 'NEX'不是内部或外部命令,也不是可运行的程序 或批处理文件 找不到操作 ...
@echo off SET/p TT=天数: SET/p PH=路径: set p1=%date:~0,4% set p2=%date:~5,2% set p3=%date:~8,2% setlocal enabledelayedexpansion for /l %%a in (1,1,3) do ( for /f "delims=0 tokens=*" %%i in ("!p%%a!") do set p%%a=%%i ) if %p3% gtr %TT% goto ppp :nxt set/a p2-=1 if %p2% equ 0 set/a p1-=1&&set p2=12 SET/a PN1=%p1%%%4 set PN2=28 if %PN1% EQU 0 set pN2=29 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% set p2=0%p2% set p2=%p2:~-2,2% set p3=0%p3% set p3=%p3:~-2,2% for %%i in ("%PH%\*") do set t=%%~ti &&call :loop "%%~fi" pause goto :eof :loop if not "%~1" == "%~f0" ( IF %p1%%p2%%p3% equ %t:~0,4%%t:~5,2%%t:~8,2% del "%~1" /S/Q/F ) 抱歉 漏一标签 不知道现在怎么样 我这里不是2000系统 [ Last edited by terse on 2008-2-4 at 03:12 AM ]

作者: fzp1978321     时间: 2008-2-4 03:59
20: C:\1002 'NEX'不是内部或外部命令,也不是可运行的程序 或批处理文件 找不到操作 变成这样了,晕 也麻烦你了 我删20天前的数据

作者: fzp1978321     时间: 2008-2-4 12:34
fastslz,我今天试了下,我在C:\下建立了个FTP文件夹,里面自己做了几个日期为2008-02-04的文件,然后去执行,但是在CMD.EXE中只显示"请按任意键继续",啥动静都没,咋回事呢? 执行代码如下: @echo off regedit /e "%temp%\bak.reg" "HKEY_CURRENT_USER\Control Panel\International" call :DateFormat >tmp.vbs echo Wscript.echo FormatDateTime (DateAdd("d",-7,Date),2) for /f "delims=" %%i in ('cscript.exe //nologo tmp.vbs') do set aDate=%%i del tmp.vbs ver|find "2000">nul&&set aDate=%aDate:~2% set aDate=%aDate:-=% setlocal EnableDelayedExpansion for /f "delims=" %%i in ('dir/s/b/a-d "C:\ftp\*.*"') do ( set fileDate=%%~ti set fileDate=!fileDate:~0,-6! set fileDate=!fileDate:-=! if !fileDate! LSS %aDate% del /q/f "%%i" ) regedit /s "%temp%\bak.reg" del /q "%temp%\bak.reg" pause exit :DateFormat >aDate.reg echo REGEDIT4 >>aDate.reg echo. >>aDate.reg echo [HKEY_CURRENT_USER\Control Panel\International] >>aDate.reg echo "sShortDate"="yyyy-MM-dd" >>aDate.reg echo "sDate"="-" regedit /s aDate.reg del aDate.reg goto:eof pause 执行结果:"请按任意键继续"

作者: terse     时间: 2008-2-4 13:00
Originally posted by fzp1978321 at 2008-2-4 03:59: 20: C:\1002 'NEX'不是内部或外部命令,也不是可运行的程序 或批处理文件 找不到操作 变成这样了,晕 也麻烦你了 我删20天前的数据
晕了 整个P里都找不到NEX 怎么会这样 我这里测试都好了

作者: fastslz     时间: 2008-2-4 14:09
没有可删除的文件就显示请按任意键继续 把 del /q "%temp%\bak.reg" pause exit 中间那个pause去掉就可以了 另外你还可以用rar.exe或 WinRAR压缩文件小于%aDate%日期的文件压缩好再删除(有该功能参数的)这样3行VBS代码就解决你全部问题. 我现在办年货了,没时间帮你了,自己看rar帮助琢磨下吧

作者: fzp1978321     时间: 2008-2-4 15:58
但是我是把电脑时间调到2008-01-04做了几个文件,然后把电脑调到2008-01-11来删除,结果文件并没有被删除. 我上面照你代码改的,有没出错呢?是不是哪漏掉了?

作者: fastslz     时间: 2008-2-8 22:52
Originally posted by fzp1978321 at 2008-2-4 15:58: 但是我是把电脑时间调到2008-01-04做了几个文件,然后把电脑调到2008-01-11来删除,结果文件并没有被删除. 我上面照你代码改的,有没出错呢?是不是哪漏掉了?
代码在XP系统默认状态的情况下绝对没问题的 我不能手把手的给你测试 自己把if !fileDate! LSS %aDate% del /q/f "%%i"改成 echo if !fileDate! LSS %aDate% del /q/f "%%i"排错

作者: manys518     时间: 2008-2-9 21:23
start notepad.exe

作者: fastslz     时间: 2008-2-9 21:56
Rar方式压缩旧文件再删除(XP Win200通用)
@echo off
regedit /e "%temp%\bak.reg" "HKEY_CURRENT_USER\Control Panel\International"
>aDate.reg echo REGEDIT4
>>aDate.reg echo.
>>aDate.reg echo [HKEY_CURRENT_USER\Control Panel\International]
>>aDate.reg echo "sShortDate"="yyyy-MM-dd"
>>aDate.reg echo "sDate"="-"

>tmp.vbs echo Wscript.echo FormatDateTime (DateAdd("d",-7,Date),2)
for /f "delims=" %%i in ('cscript.exe //nologo tmp.vbs') do set aDate=%%i
del tmp.vbs
"%ProgramFiles%\WinRAR\rar.exe" a -ep2 -df -r -tb%aDate% "xxx.rar" "xxx\*"
regedit /s aDate.reg
del aDate.reg
pause

作者: abcd     时间: 2008-3-6 20:02
似乎用-to7d比较好点,不需要用到vbs 不过文件大就麻烦了

作者: 3853484     时间: 2008-3-7 17:02
呵呵学习了