分享

【引用】定时删除一个文件下的所有子文件夹及文件

 悟静 2011-08-09

请问怎样定时删除一个文件夹内的所有子文件夹和文件呢?同时又要保留那个父文件夹。比如我要删除d:\test\ 内的所有子文件夹和文件,但保留test这个夹子,我是win2000的域,请问怎样实现呢?bat可以吗?

回答:在win9x的年代,用deltree这个外部命令就很容解决这个问题,不过从windows 2000 及windows xp之后,就取消了这个命令(真的是很奇怪),那么现在怎么解决呢?大家可能想到用 del+rd来解决这个问题。但有个问题,就是rd命令会删除您指定的目录。例如,当前目录结构如下:
D:\>attrib /s /d d:\test\*.*
A    R  I    D:\test\1.txt          此文件带有只读属性
A   H   I    D:\test\2.txt          此文件带有隐藏属性
A  S    I    D:\test\3.txt          此文件带有系统属性
     H   I    D:\test1\1             此目录带有隐藏属性
A    R  I    D:\test\1\4.txt       此文件带有只读属性
    S    I    D:\test1\2             此目录带有系统属性
A    R  I    D:\test1\2\5.txt     此文件带有只读属性

批处理原理 如果您这么执行命令 rd d:\test,那么rd会将test这个目录连同其中的内容一起删除掉,而我们要保留test这个目录。那么怎么办呢?我们可以先用del把d:\test目录下的文件删除掉,然后再用rd把子目录删除掉。这个批处理的内容如下,大家将如下内容保存为后缀名为.bat 或者.cmd的文本文件,例如就叫 deltree.bat吧。
---不包含此行---
attrib -s -h -r %1\*.* && del %1\*.* /q
dir %1 /ad /b /s >del.txt
for /f %%i in (del.txt) do rd %%i /s /q
---不包含此行---
那么当我们需要删除test目录的时候,就这么执行 "deltree.bat d:\test"(不包含引号)。

批处理第一行 第一行批处理中的%1就会读取批处理参数,变成这样 attrib -s -h -r d:\test\*.* && del d:\test\*.* /q
先用attrib 去掉test目录下所有文件的属性,以保障后面的del顺利执行。
&& 是连接符号,当执行完前面的命令后,执行连接符后面的命令。
del删除 test目录下所有文件,因为rd命令是无法删除test目录下的文件的。好,test下的文件删除完了,我们就开始删除test目录下的子目录。

批处理第二行 批处理执行到第二行,%1读取批处理参数,就是我们在deltree后面输入的的 d:\test,变成这样 dir d:\test /ad /b /s >del.txt 这里dir命令后的各参数含义如下:
 /AD          显示具有指定属性的目录。从而让后面的rd命令删除这些目录
/B          使用空格式(没有标题信息或摘要)。避免后面的删除命令出错,因为dir命令还会输出一些其它信息,例如“ 驱动器 C 中的卷没有标签。 卷的序列号是 EE5B-D3AF”,显然这会导致rd命令出错。
/S          显示指定目录和所有子目录中的文件。输出目录及文件的完整路径,便于后面rd命令删除。
执行完这一行批处理后,在当前目录下会产生 del.txt文件,您执行 type del.txt,会看到如下输出:
d:\test1\1
d:\test1\2
为什么要输出到文本文件呢?为什么不直接把dir的结果输出给rd呢?因为dir的结果会有多行,如果一行一行写,不是太麻烦了吗?而且将来实际运用批处理的时候,我们也无法预测目标文件夹下会有多少个子目录。将dir结果输出到文本文件,然后让rd去读不是很方便吗?

批处理第三行 好,我们已经将要删除的子目录列表输出到文本文件del.txt中了,只要使用rd命令删除这些目录就好了。但实际上rd本身没有读取文本文件的功能,我们用for来解决这个问题。批处理执行到了最后一行:for /f %%i in (del.txt) do rd %%i /s /q
%%i是在for语句中使用的循环变量,这个变量每使用一次,就从 del.txt中读取一行,作为变量值,然后for负责将这个变量传递给后面 do执行的命令中,那么for依次执行循环所形成的命令就是这样的:
第一次循环 rd d:\test1\1 /s /q
第二次循环 rd d:\test1\2 /s /q
gnaw0725注:关于for循环的更多解释请参考 http://gnaw0725./logs/4888698.html
这里的rd参数含义如下:
/S      除目录本身外,还将删除指定目录下的所有子目录和文件。用于删除目录树。
/Q      安静模式,带 /S 删除目录树时不要求确认

故障排查 好,到此位置,deltree.bat这个批处理就删除了d:\test下的所有文件和文件夹,而无论它们带什么属性。如果大家在使用这个批处理的过程中出现了问题,例如没有删除掉文件,那么如何进行故障排查呢?我们可以有两个check point:
批处理参数获取 就是考察批处理是否正确获取了参数,也就是我们输入的目标文件夹,我们可以在批处理的最前面加一个echo %1 ,看看结果,就是这样:
echo %1
attrib -s -h -r %1\*.* && del %1\*.* /q
gnaw0725注:批处理可以有9个参数,%0代表批处理自己,第一个参数%1,第二个%2,……依此类推
子目录输出列表 就是del.txt,您可以输入 type del.txt,如果正常,输出的内容应该是d:\test下的所有子目录。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ljc007/archive/2010/01/16/5198756.aspx

 

日期时间]批处理删除指定天数日期之前的文件夹 收藏 

【方案一】BAT + REG + VBS


view plaincopy to clipboardprint?

@echo off   

::演示:删除指定路径下指定天数之前(以文件夹的最后修改日期为准)的文件夹。   

::如果演示结果无误,把rd前面的echo去掉,即可实现真正删除。   

::本例调用了临时VBS代码进行日期计算   

::本例为兼容不同的日期格式,调用reg命令(XP系统自带)统一设置日期格式,   

::处理完毕之后再把日期格式恢复成原来的状态。   

  

rem 指定待删除文件夹的存放路径   

set SrcDir=C:\Test   

rem 指定天数   

set DaysAgo=1   

for /f "skip=2 delims=" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (   

    set "RegDateOld=%%a"  

)   

set RegDateOld=%RegDateOld:~-8%   

reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul   

>"%temp%\DstDate.vbs" echo LastDate=date()-%DaysAgo%   

>>"%temp%\DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)   

>>"%temp%\DstDate.vbs" echo wscript.echo FmtDate   

for /f %%a in ('cscript /nologo "%temp%\DstDate.vbs"') do (   

    set "DstDate=%%a"  

)   

set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%   

for /d    %%a in ("%SrcDir%\*.*") do (   

    if "%%~ta" leq "%DstDate%" (   

        if exist "%%a\"  

            echo rd /s /q "%%a"  

        )   

    )   

)   

reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul   

pause  

@echo off

::演示:删除指定路径下指定天数之前(以文件夹的最后修改日期为准)的文件夹。

::如果演示结果无误,把rd前面的echo去掉,即可实现真正删除。

::本例调用了临时VBS代码进行日期计算

::本例为兼容不同的日期格式,调用reg命令(XP系统自带)统一设置日期格式,

::处理完毕之后再把日期格式恢复成原来的状态。


rem 指定待删除文件夹的存放路径

set SrcDir=C:\Test

rem 指定天数

set DaysAgo=1

for /f "skip=2 delims=" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (

    set "RegDateOld=%%a"

)

set RegDateOld=%RegDateOld:~-8%

reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul

>"%temp%\DstDate.vbs" echo LastDate=date()-%DaysAgo%

>>"%temp%\DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)

>>"%temp%\DstDate.vbs" echo wscript.echo FmtDate

for /f %%a in ('cscript /nologo "%temp%\DstDate.vbs"') do (

    set "DstDate=%%a"

)

set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%

for /d    %%a in ("%SrcDir%\*.*") do (

    if "%%~ta" leq "%DstDate%" (

        if exist "%%a\"

            echo rd /s /q "%%a"

        )

    )

)

reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul

pause 


【方案二】BAT + REG + Ritchie Lawrence 日期函数


view plaincopy to clipboardprint?

@echo off   

::演示:删除指定路径下指定天数之前(以文件夹的最后修改日期为准)的文件夹。   

::如果演示结果无误,把rd前面的echo去掉,即可实现真正删除。   

::本例调用了 Ritchie Lawrence 的日期函数进行日期计算   

::日期转换的核心算法请参考http://bbs./thread-3056-1-1.html   

::本例为兼容不同的日期格式,调用reg命令(XP系统自带)统一设置日期格式,   

::处理完毕之后再把日期格式恢复成原来的状态。   

  

rem 指定待删除文件夹的存放路径   

set SrcDir=C:\Test   

rem 指定天数   

set DaysAgo=1   

for /f "skip=2 delims=" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (   

    set "RegDateOld=%%a"  

)   

set RegDateOld=%RegDateOld:~-8%   

reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul   

call :DateToDays %date:~0,4% %date:~5,2% %date:~8,2% PassDays   

reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul   

set /a PassDays-=%DaysAgo%   

call :DaysToDate %PassDays% DstYear DstMonth DstDay   

set DstDate=%DstYear%%DstMonth%%DstDay%   

set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%   

for /d    %%a in ("%SrcDir%\*.*") do (   

    if "%%~ta" leq "%DstDate%" (   

        if exist "%%a\"  

            echo rd /s /q "%%a"  

        )   

    )   

)   

reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul   

pause   

goto :eof   

  

:DateToDays %yy% %mm% %dd% days   

setlocal ENABLEEXTENSIONS   

set yy=%1&set mm=%2&set dd=%3   

if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)   

set /a dd=100%dd%%%100,mm=100%mm%%%100   

set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2   

set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633   

endlocal&set %4=%j%&goto :EOF   

  

:DaysToDate %days% yy mm dd   

setlocal ENABLEEXTENSIONS   

set /a a=%1+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a   

set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5   

set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10   

(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)   

endlocal&set %2=%yy%&set %3=%mm%&set %4=%dd%&goto :EOF  

@echo off

::演示:删除指定路径下指定天数之前(以文件夹的最后修改日期为准)的文件夹。

::如果演示结果无误,把rd前面的echo去掉,即可实现真正删除。

::本例调用了 Ritchie Lawrence 的日期函数进行日期计算

::日期转换的核心算法请参考http://bbs./thread-3056-1-1.html

::本例为兼容不同的日期格式,调用reg命令(XP系统自带)统一设置日期格式,

::处理完毕之后再把日期格式恢复成原来的状态。


rem 指定待删除文件夹的存放路径

set SrcDir=C:\Test

rem 指定天数

set DaysAgo=1

for /f "skip=2 delims=" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (

    set "RegDateOld=%%a"

)

set RegDateOld=%RegDateOld:~-8%

reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul

call :DateToDays %date:~0,4% %date:~5,2% %date:~8,2% PassDays

reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul

set /a PassDays-=%DaysAgo%

call :DaysToDate %PassDays% DstYear DstMonth DstDay

set DstDate=%DstYear%%DstMonth%%DstDay%

set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%

for /d    %%a in ("%SrcDir%\*.*") do (

    if "%%~ta" leq "%DstDate%" (

        if exist "%%a\"

            echo rd /s /q "%%a"

        )

    )

)

reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul

pause

goto :eof


:DateToDays %yy% %mm% %dd% days

setlocal ENABLEEXTENSIONS

set yy=%1&set mm=%2&set dd=%3

if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)

set /a dd=100%dd%%%100,mm=100%mm%%%100

set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2

set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633

endlocal&set %4=%j%&goto :EOF


:DaysToDate %days% yy mm dd

setlocal ENABLEEXTENSIONS

set /a a=%1+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a

set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5

set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10

(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)

endlocal&set %2=%yy%&set %3=%mm%&set %4=%dd%&goto :EOF 


【方案三】BAT + VBS


view plaincopy to clipboardprint?

@echo off   

::演示:删除指定路径下指定天数之前(以文件夹的最后修改日期为准)的文件夹。   

::如果演示结果无误,把rd前面的echo去掉,即可实现真正删除。   

::本例调用了临时VBS代码进行日期计算,并统一设置系统日期格式,处理完毕   

::之后再把日期格式恢复成原来的状态。摆脱了对reg命令(XP系统自带)的依赖。   

  

rem 指定待删除文件夹的存放路径   

set SrcDir=C:\test   

rem 指定天数   

set DaysAgo=1   

>"%temp%\BackupDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")   

>>"%temp%\BackupDate.vbs" echo WScript.Echo WshShell.RegRead ("HKEY_CURRENT_USER\Control Panel\International\sShortDate")   

for /f %%a in ('cscript /nologo "%temp%\BackupDate.vbs"') do (   

    set "RegDateOld=%%a"  

)   

>"%temp%\UnifyDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")   

>>"%temp%\UnifyDate.vbs" echo WshShell.RegWrite "HKEY_CURRENT_USER\Control Panel\International\sShortDate", "yyyy-M-d", "REG_SZ"  

cscript /nologo "%temp%\UnifyDate.vbs"  

>"%temp%\DstDate.vbs" echo LastDate=date()-%DaysAgo%   

>>"%temp%\DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)   

>>"%temp%\DstDate.vbs" echo wscript.echo FmtDate   

for /f %%a in ('cscript /nologo "%temp%\DstDate.vbs"') do (   

    set "DstDate=%%a"  

)   

set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%   

for /d    %%a in ("%SrcDir%\*.*") do (   

    if "%%~ta" leq "%DstDate%" (   

        if exist "%%a\"  

            echo rd /s /q "%%a"  

        )   

    )   

)   

>"%temp%\RecoverDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")   

>>"%temp%\RecoverDate.vbs" echo WshShell.RegWrite "HKEY_CURRENT_USER\Control Panel\International\sShortDate", "%RegDateOld%", "REG_SZ"  

cscript /nologo "%temp%\RecoverDate.vbs"  

pause  

@echo off

::演示:删除指定路径下指定天数之前(以文件夹的最后修改日期为准)的文件夹。

::如果演示结果无误,把rd前面的echo去掉,即可实现真正删除。

::本例调用了临时VBS代码进行日期计算,并统一设置系统日期格式,处理完毕

::之后再把日期格式恢复成原来的状态。摆脱了对reg命令(XP系统自带)的依赖。


rem 指定待删除文件夹的存放路径

set SrcDir=C:\test

rem 指定天数

set DaysAgo=1

>"%temp%\BackupDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")

>>"%temp%\BackupDate.vbs" echo WScript.Echo WshShell.RegRead ("HKEY_CURRENT_USER\Control Panel\International\sShortDate")

for /f %%a in ('cscript /nologo "%temp%\BackupDate.vbs"') do (

    set "RegDateOld=%%a"

)

>"%temp%\UnifyDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")

>>"%temp%\UnifyDate.vbs" echo WshShell.RegWrite "HKEY_CURRENT_USER\Control Panel\International\sShortDate", "yyyy-M-d", "REG_SZ"

cscript /nologo "%temp%\UnifyDate.vbs"

>"%temp%\DstDate.vbs" echo LastDate=date()-%DaysAgo%

>>"%temp%\DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)

>>"%temp%\DstDate.vbs" echo wscript.echo FmtDate

for /f %%a in ('cscript /nologo "%temp%\DstDate.vbs"') do (

    set "DstDate=%%a"

)

set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%

for /d    %%a in ("%SrcDir%\*.*") do (

    if "%%~ta" leq "%DstDate%" (

        if exist "%%a\"

            echo rd /s /q "%%a"

        )

    )

)

>"%temp%\RecoverDate.vbs" echo Set WshShell = WScript.CreateObject("WScript.Shell")

>>"%temp%\RecoverDate.vbs" echo WshShell.RegWrite "HKEY_CURRENT_USER\Control Panel\International\sShortDate", "%RegDateOld%", "REG_SZ"

cscript /nologo "%temp%\RecoverDate.vbs"

pause 


【方案四】字符串截取


view plaincopy to clipboardprint?

@echo off   

::演示:删除指定路径下指定天数之前(以文件夹名中包含的日期字符串为准)的文件夹。   

::如果演示结果无误,把rd前面的echo去掉,即可实现真正删除。   

::本例假设文件夹名中包含的日期字符串(比如:Archive-2009-12-25)   

  

rem 指定待删除文件夹的存放路径   

set SrcDir=C:\test   

rem 指定天数   

set DaysAgo=1   

  

>"%temp%\DstDate.vbs" echo LastDate=date()-%DaysAgo%   

>>"%temp%\DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)   

>>"%temp%\DstDate.vbs" echo wscript.echo FmtDate   

for /f %%a in ('cscript /nologo "%temp%\DstDate.vbs"') do (   

  set "DstDate=%%a"  

)   

set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%   

  

setlocal enabledelayedexpansion   

for /d  %%a in ("%SrcDir%\*.*") do (   

  if "%%~ta" leq "%DstDate%" (   

    set "FolderDate=%%~na"  

    set "FolderDate=!FolderDate:~8,10!"  

    if "!FolderDate!" leq "%DstDate%" (   

        if exist "%%a\" (   

            echo rd /s /q "%%a"  

        )   

    )   

  )   

)   

endlocal   

pause  

@echo off

::演示:删除指定路径下指定天数之前(以文件夹名中包含的日期字符串为准)的文件夹。

::如果演示结果无误,把rd前面的echo去掉,即可实现真正删除。

::本例假设文件夹名中包含的日期字符串(比如:Archive-2009-12-25)


rem 指定待删除文件夹的存放路径

set SrcDir=C:\test

rem 指定天数

set DaysAgo=1


>"%temp%\DstDate.vbs" echo LastDate=date()-%DaysAgo%

>>"%temp%\DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)

>>"%temp%\DstDate.vbs" echo wscript.echo FmtDate

for /f %%a in ('cscript /nologo "%temp%\DstDate.vbs"') do (

  set "DstDate=%%a"

)

set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%


setlocal enabledelayedexpansion

for /d  %%a in ("%SrcDir%\*.*") do (

  if "%%~ta" leq "%DstDate%" (

    set "FolderDate=%%~na"

    set "FolderDate=!FolderDate:~8,10!"

    if "!FolderDate!" leq "%DstDate%" (

        if exist "%%a\" (

            echo rd /s /q "%%a"

        )

    )

  )

)

endlocal

pause 


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多