曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 2798|回复: 0
打印 上一主题 下一主题

[实例.其它] 删除大小和类型一样的文件

[复制链接]

716

主题

734

帖子

2946

积分

超级版主

Rank: 9Rank: 9Rank: 9

积分
2946
跳转到指定楼层
楼主
发表于 2014-5-13 12:19:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个实例用来删除大小和类型都一样的文件。实际上,该实例并没有多大用处,因为只是判断大小和类型一样了就删除,难免会造成误删。因此,该程序并不作为实际运用,重点在于程序的本身涉及多个知识点,可以用以讨论研究也是不错的。

程序代码:
  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. for /f "tokens=*" %%a in ('dir/a-d/b/oe') do set/a c+=1&set a!c!=%%a&set b!c!=%%~za&set c!c!=%%~xa
  4. for /l %%a in (1,1,%c%) do set/a d=%%a+1&for /l %%b in (!d!,1,%c%) do if not !b%%a!.==. call :1 %%a %%b
  5. goto :eof
  6. :1
  7. if !b%1!==!b%2! if !c%1!==!c%2! set b%2=&del "!a%2!"
  8. goto :eof
复制代码


首先,SETLOCAL ENABLEDELAYEDEXPANSION 是使用延迟变量的声明,延迟变量是用两个感叹号括起来的变量。如果你的程序中如果涉及到使用 & 符号,那么你应该考虑在程序中声明该语句。关于延迟变量更多的讨论可参考《延迟变量详解

程序中涉及到了 3 个 for 循环,并且在循环中使用了一堆密密麻麻的东西,下面逐一讲解这些细节。

首先,dir/a-d/b/oe 这个命令把目录下所有的普通文件名输出来,而且是按照扩展名来排序的,不如:


语句  set/a c+=1 用来统计这些普通文件一共有多少个,存入 c 变量中。

set a!c!=%%a 该条语句是将文件名分别存入 a1, a2, a3... ...an 这些名字中。



第 3 个 for 循环是第 2 个 for 循环的自循环,这整条语句的意思是,找到
set b!c!=%%~za 这条语句将每个文件的大小存入 b1, b2, b3... ...bn 这些名字中,%%~za 是一种扩展用法。

set c!c!=%%~xa 这条语句将文件的扩展名存入到 c1, c2, c3... ...cn 这些名字中,同样,%%~xa 也是一种扩展用法。

删除同类型同大小文件的思路是:从第一个文件开始,依次遍历其它所有的文件,经过比较如果发现满足条件的,就将其删除,然后将相应的 bn (文件的大小记录)置为空(if !b%1!==!b%2! if !c%1!==!c%2! set b%2=&del "!a%2!")。这样,在下一轮的遍历比较中,发现有空的记号,就不会去执行 :1 这个子程序(if not !b%%a!.==. call :1 %%a %%b)。

子程序 :1 的功能就是比较文件大小和类型,如果一样,就将其删除,然后对删除的文件做一个标记。它接受两个参数 %%a 和 %%b ,它们分别作为大循环和小循环的遍历因子。


比如有 A B C D E F G H I J K 这么多个文件,第一轮中,首先拿 A 和其后的所有元素相比,如果有相同的,就删掉那文件,然后将被删除的做个记号----表示其大小的变量 b1, b2, b3 的值置空。
如果 B 文件在第一轮的对比中被删除,那么第 2 轮中的子 for 循环可以说是白走一趟,因为后面的元素都是在和一个空的 bn 记录作比较。如果 B 文件没有被删除,那么它在比对的过程中,也可能经历已被删除的文件记录做对比。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 23:54 , Processed in 0.077764 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表