定时删除一个文件夹内的所有子文件夹和文件的方法

在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://www.jb51.net/article/31284.htm
这里的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下的所有子目录。

我们小编补充:

其实删除文件与文件夹的命令用rd更简单与粗暴,具体的可以可以参考下面的命令:

代码如下:

rd /s /q f:\ddd

(0)

相关推荐

  • Windows和Linux下定时删除某天前的文件的脚本

    以前做到最多的定时我们就是定时备份功能了,我们常用利用定时功能来备份网站数据或备份数据库了,下面我来给(www.jb51.net)大家介绍几个Linux与Windows中定时删除某天前的文件方法,这个与备份有点区别,但大同小义了. Windows下bat文件内容如下: 复制代码 代码如下: @echo off forfiles -p "D:\servers\apache2.2\logs" -s -m *.log -d -15 -c "cmd /c del @path"

  • Shell定时删除指定时间之前的文件

    最近世界杯来了,一直忙于工作和世界杯之间,都没有空来管管我的blog了,今天只能整个简单的小shell给大家了.公司要求删除一个月之前的备份文件,免得把硬盘给整爆了,上服务器看了下,居然都有3个月的备份没有清理了,还好是sql备份,不然硬盘空间早就满了. 下面是我的解决办法: 复制代码 代码如下: cat delbak.sh #!/bin/sh location="/root/sqlbak/" find $location -mtime +30 -type f |xargs rm -f

  • 使用vbs脚本定时删除N天前的文件

    脚本放在定时任务里代替服务定时执行一些操作比较方便,下面是实现删除文件夹下N天前创建的文件的vbs脚本,在配置文件 DelFolderList.txt 中配置要删除的文件路径,ONLY-DEL-FILES 下的路径 是只删除其下的文件,不删除其内的子目录的文件.DEL-FOLDER-FILES下的路径 是删除其内文件及其子目录内的文件,子目录为空时删除目录,删除的文件list 放在log文件夹内.例配置文件DelFolder.txt 内容如下: ONLY-DEL-FILESE:\Code\tes

  • vbs 定时删除功能实现代码

    参考代码一: 复制代码 代码如下: Function DeleteLog( )    Dim objFSO, objFolder, strPath, targetFSO, subFSO, DirPath       DirPath = createobject("Scripting.FileSystemObject").GetFile(Wscript.ScriptFullName).ParentFolder.Path&"\Log\"    Set objFS

  • 使用mysql事件调度器定时删除binlog

    MySQL的事件调度器可以精确到每秒钟执行一个任务,对于一些对数据实时性要求比较高的应用(例如:股票.赔率.比分等)就非常适合.先查看是否启动这个功能: 复制代码 代码如下: SELECT @@event_scheduler; 在使用这个功能之前必须确保 event_scheduler已开启,可执行: 复制代码 代码如下: SET GLOBAL event_scheduler = 1; 或我们可以在配置my.cnf文件 中加上event_scheduler = 1然后来对 binlog 的删除写

  • php定时删除文件夹下文件(清理缓存文件)

    那么有没有方法自动清理临时文件夹呢? 以下代码就是一个简单定时清理文件夹下文件的php代码. ps:这个代码如果不重启网站会一直执行下去,所以只用作于本地环境测试,请别在网站上测试. 复制代码 代码如下: <?php ignore_user_abort(); //客户端断开时,可以让脚本继续在后台执行 set_time_limit(0); //忽略php.ini设置的脚本运行时间限制 $interval = 5*60; //设置执行周期,单位为秒,5分钟为 5*60=300 do{ $dir =

  • 定时删除一个文件夹内的所有子文件夹和文件的方法

    在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 

  • 递归删除一个节点以及该节点下的所有节点示例

    有的时候删除信息的时候,需要把这条信息下的所有的都删除,这个时候就需要递归删除了.下面是我在做部门管理中的删除部门功能的时候写的一段递归删除一个部门以及它的所有子部门的一段代码.仅供大家参考和自己以后备用. 下面是我的一段代码的展示: 复制代码 代码如下: /* * 修改一条部门信息 */ function del($bumen_id){ $sql="select bumen_id from lxsm_bumen where topbumen_id=".$bumen_id; //查询以

  • php删除一个路径下的所有文件夹和文件的方法

    php遍历一个文件夹内的所有文件和文件夹,并删除所有文件夹和子文件夹下的所有文件的代码,通过递归方式实现达到清空一个目录的效果,代码简单实用. 也适合在thinkphp中清理缓存,在thinkphp中可以把下面代码写入./Application/Admin/Common/function.php文件中,再在控制器调用这个函数进行清理操作. 用到的函数: scandir($path)    遍历一个文件夹所有文件并返回数组.     unlink($filename)    删除文件.     r

  • Java实现文件夹中内容定时删除

    今天我和大家分享一下用Java实现对一个文件夹中内容定时删除. 让我们来看一下对一个文件夹中内容定时删除的功能. 对于文件的删除就是用File类中的delete()方法删除当前File所表示的文件或者目录(空目录),不过这里要注意对于目录的删除是要判断该目录是否是空目录,不是空目录不能删除,还需要对该目录进行递归查找该目录里的文件并删除,如果递归查找的还是目录,那么继续进行上面的操作. 定时功能呢?java.util包中有一个Timer类,Timer类用于创建定时器类,Timer类中有sched

  • Java利用文件输入输出流实现文件夹内所有文件拷贝到另一个文件夹

    一.基本目标 使用Java完成如下的操作: 把一个文件夹内的所有文件拷贝的另一的文件夹,例如,在F盘中有a与b两个文件夹: f:/a里面有一堆文件,运行Java程序之后就会全部复制到f:/b,并且完成重命名,在所有文件之前加rename_的前缀,如果里面有文件夹,则文件夹不重命名,里面的文件进行重命名,同样在所有文件之前加rename_的前缀: 二.制作过程 1.首先主函数非常简单,就是调用了上面FileTest类中的copyFolder函数 public class FileCopy { pu

  • Python判断一个文件夹内哪些文件是图片的实例

    如下所示: def is_img(ext): ext = ext.lower() if ext == '.jpg': return True elif ext == '.png': return True elif ext == '.jpeg': return True elif ext == '.bmp': return True else: return False 调用时 for x in os.listdir(directory): if is_img(osp.splitext(x)[1

  • shell脚本实现定时删除文件或文件夹

    一.删除XX天(默认10天)之前某个目录下面带.log的日志文件,并且输出文件显示删除的文件 #!/bin/sh #如果没有输入变量值,默认天数为10 start=$(date +%y-%m-%d-%H%M%m) File=/temp/delete_$start.txt FilePath=/data echo $File if [ ! -n "$1" ]; then     day=10 else      day=$1 fi #-mtime 10 表示文件修改时间距离当前为0天的文件

  • 批处理统计文件夹内的所有文件的数量和总大小的bat

    我最近电脑不知道为什么磁盘空间会慢慢的变小,而且过一段时间之后,又会有两三GB的空间被释放出来,使用我想监控下,看看是那个文件夹下产生的文件来占用我的存储空间,我想按层监视,最终找出原因. 从网上找个命令行显示指定文件夹目录的大小的批处理程序,但是发现并不太尽人意,总感觉不是很适合我的使用: 第一个程序,可以显示某个文件夹下的文件大小,但是我想按层显示,却不能满足我的要求,程序如下: @echo off echo. set /p dirPath=please input folder path:

  • 动感网页相册 python编写简单文件夹内图片浏览工具

    不知道大家有没有这样的体验,windows电脑上查看一张gif图,默认就把IE给打开了,还弹出个什么询问项,好麻烦的感觉.所以为了解决自己的这个问题,写了个简单的文件夹内图片浏览工具. 效果图 以E盘某一文件夹为例 效果图 实现思路 业务代码 # coding:utf-8 import sys reload(sys) sys.setdefaultencoding('utf8') # __author__ = '郭 璞' # __date__ = '2016/8/5' # __Desc__ = 自

随机推荐