看了看以前写的总结,发现有这样的一个批处理,还是挺有意思。拿出来分享一下。
1、 for /d %%i in (*) do (
2、 rem set _day=%%~ti
3、 cd %%i
4、 for %%j in (*) do (
5、 @echo j: %%j
6、 set file1=%~dp0%%i\%%j
7、 @echo xxx: %~dp0%%i\%%j
8、 set file2=C:\text\%%i\%%j
9、 @echo yyy: C:\text\%%i\%%j
10、 echo file1 : %file1%
11、 echo file2 : %file2%
12、 rem set t1=%%~tj
13、 rem set t2=C:\text\%%i\%%~tj rem 当前目录名
14、 rem echo t1:!t1!
15、 rem echo t2:!t2!
16、 call :deal "%~dp0%%i\%%j" "C:\text\%%i\%%j" & rem调用时间对比
17、 )
18、 cd ../
19、 echo i: %%i
20、 echo t: %%~ti
21、 )
22、 :deal
23、 rem if "%~t1"=="%~t2" (echo same)else echo different
24、 if "%~t1" gtr "%~t2" (
25、 pause
26、 echo copy
27、 copy %1 %2
28、 )
下面是分析:
第一行:一个for循环,“/d”是只遍历目录,“%%i”是给“i”赋值,也就是循环的赋予“i”不同的文件夹的名称,“in(*)”是代表默认是当前文件夹里面所有子文件夹,do(…)里面是要进行的处理,这里要注意格式。
第二行:“望文生义”就是要进入到子文件夹里面了。
第三行:这里嵌套了一个for循环,什么意思??哈哈,看看第一行的解释吧。
第四行:打印j的值,也就是子文件夹里面的文件名,“echo”前面多了一个“@”表示以下指令不需要在dos窗口显示了。
第五行:设置一个变量,并给它赋值,“%~dp0”是当前文件路径,拿file1的值知道了吗,其实就是路径+文件名。
第六行:打印。
第七行:估计第五行表示什么你懂了,那咋们就继续往下吧。
第九行:
第十行:
第十一行:
第十二到十五行:是注释语句,“rem”当时是调试用的。
第十六行:进行了一个调用:“call”,其调用的是标示符为“:deal”下面的内容,传递进了两个参数:"%~dp0%%i\%%j"跟"C:\text\%%i\%%j",其实也就是路劲+文件名,这样一说,明了了吧,两个要比较的文件呢。
第二十四行:那我们就顺便看看“:deal”里面是什么东东吧。一个“if”,条件判断语句:如果“%~t1”大于“%~t2”就执行括号里面的内容。“gtr”是比较符,大于的意思,更多比较符的解释可以查看相关资料。而“%~t1”跟“%~t2”呢,根据我们上面陈述的程序的功能,无疑就是两个文件的修改时间了。这里需要解释一下,"%1"跟"%2"分别代表“call”语句中传递进来的两个参数,而"%~t1"跟"%~t2"呢,就是获取两个参数的修改时间了。括号里面值得一提的是“pause”语句,意思是“阻断一下”,运行文件是在dos窗口下看到的是“请按任意键继续”。说到这里,括号里面的剩下内容应该看懂了吧。
第十八行:回来for循环中,这行的意思跟linux下是一样的:跳到上一层目录下。后面两行的意思就不要解释了,当时也是调试用的。执行完这两条语句,我们就重新给“%%i”赋值,这样就可以达到了遍历的目的了。