|
这个实例用来删除大小和类型都一样的文件。实际上,该实例并没有多大用处,因为只是判断大小和类型一样了就删除,难免会造成误删。因此,该程序并不作为实际运用,重点在于程序的本身涉及多个知识点,可以用以讨论研究也是不错的。
程序代码:
- @ECHO OFF
- SETLOCAL ENABLEDELAYEDEXPANSION
- 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
- 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
- goto :eof
- :1
- if !b%1!==!b%2! if !c%1!==!c%2! set b%2=&del "!a%2!"
- 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
|