看了看以前写的总结,发现有这样的一个批处理,还是挺有意思。拿出来分享一下。
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”赋值,这样就可以达到了遍历的目的了。