手机
当前位置:查字典教程网 >脚本专栏 >DOS/BAT >定时删除一个文件夹内的所有子文件夹和文件的方法
定时删除一个文件夹内的所有子文件夹和文件的方法
摘要:在win9x的年代,用deltree这个外部命令就很容解决这个问题,不过从windows2000及windowsxp之后,就取消了这个命令(...

在win9x的年代,用deltree这个外部命令就很容解决这个问题,不过从windows 2000 及windows xp之后,就取消了这个命令(真的是很奇怪),那么现在怎么解决呢?大家可能想到用 del+rd来解决这个问题。但有个问题,就是rd命令会删除您指定的目录。例如,当前目录结构如下:

D:>attrib /s /d d:test*.*

A R I D:test1.txt 此文件带有只读属性

A H I D:test2.txt 此文件带有隐藏属性

A S I D:test3.txt 此文件带有系统属性

H I D:test11 此目录带有隐藏属性

A R I D:test14.txt 此文件带有只读属性

S I D:test12 此目录带有系统属性

A R I D:test125.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:test11

d:test12

为什么要输出到文本文件呢?为什么不直接把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:test11 /s /q

第二次循环 rd d:test12 /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

【定时删除一个文件夹内的所有子文件夹和文件的方法】相关文章:

用BAT实时读取某个文件目录下文件数(包括子目录)

文件夹取其名称前两位重命名的批处理代码

在DOS下使用长文件名的方法

命令行删除带.的文件夹(畸形文件夹)

cmd rd命令 删除文件夹

bat运行时不弹出那个黑框框的完美解决方案

Comp 逐字节地比较两个文件或几组文件的内容

迅速删除非法文件名的批处理代码

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

bat批处理实现的创建10个文件夹,文件夹再包含5个空文件夹

精品推荐
分类导航