多谢楼上quya潜水兄的一番细心解释。
其实这个批处理里面最不懂的就是:
::利用变量替换判断文件属于哪一组
call set tmp=%%pic:%ext%,=%%
if not "%tmp%" == "%pic%" goto pic
自己摸索得比较慢,看了你的解释有种恍然大悟的感觉。
结合plp626兄的这个启蒙帖子:
http://www.cn-dos.net/forum/viewthread.php?tid=37382 现在我能理解到这个程度:<img src="images/smilies/face-wink.png" align="absmiddle" border="0">
依照quya兄的指点,先把call set tmp=%%pic:%ext%,=%%分解一下,变为简单一些的语句,或者说把它分解成几步来执行:
1. %ext%,=%%,即将当前文件扩展名替换为空;
2.%%pic:%ext%,=%%,先将%pic后面的%ext%换成空,然后再来对%pic%进行处理,那么存在两种情况:
a. 如果%ext%恰好是图片格式如.bmp,.jpg,那么这种替换就能影响到%pic%,即成功替换%pic%里面的【%ext%,】(这个:很关键啊!!!),而【%ext%,】已经在前面替换结果为空,所以实际上就相当于在%pic%里去掉【当前文件扩展名,】,比如【.bmp,】(注意这个,);
b. 如果%ext%不是图片格式,比如.txt,.doc,这种格式不在%pic%这组,显然也就不能影响到%pic%这组(虽然%ext%仍然已经被替换为空,但是由于它已经不在%pic%这组,所以%pic%这组中的任何字符或者字符串都不会被替换),根据批处理的逐行运行特性,下面会继续进行后面的判断等操作;
3.有了前面的判断,现在就好办多了。只需要根据上面判断+替换的结果和原来的%pic%或者%doc%等做个比较,判断是否有改变,如有,则进行一次跳转,否则继续运行后面的语句,依此运行下去,就能达到我们的目的了。这部分比较简单,就不再赘言了。
至于CALL,是用来变量延迟的,这个之前已经有所了解。
不知道我上面的理解还有没有错误或者纰漏的地方,如有望各位大侠不吝赐教。
现在回过头来想想,其实这个批处理很精彩啊!巧妙的运用了一次替换+判断来完成了批处理里不易实现的逻辑“或”(至少表面上不太容易实现,偶是菜鸟,别拍砖~~),通过这次提问,对set变量截取了解加深不少,同时也学到了变相解决一些问题的思路和方法。感谢那位斑斑和各位朋友的帮助!特别是quya兄的精彩解释和plp626兄的启蒙教程!DOS联盟正是因为许许多多这样的朋友而精彩!<img src="images/smilies/face-smile-big.png" align="absmiddle" border="0">