依照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联盟正是因为许许多多这样的朋友而精彩!作者: jingyu57 时间: 2008-7-17 08:00 多谢moniuming 兄加分鼓励。
仔细一看,发现quya兄解释里面有一处疏忽。
@echo off
set "ext=%~x1" 结果是 set ext=bmp, %1就是 xxx.bmp, %~x1 就是只取 %1的扩展名。
这里结果应该是set ext=.bmp, %1即当前文件,%~x1取得%1的扩展名时还有一个“.”。
采用echo "%~x1"做实验,得到的也是.bmp。
此外发现一个有趣的现象,并得出一个结论:
CMD判断扩展名的方法并不完美。
个人猜测CMD是以文件(文件夹)名最后一个“.”作为分隔符,取此“.”后面的字符串+这个“.”共同组成扩展名。
这样对于判断文件是没有问题的,但是如果和文件夹混在一起,就判断不清了。
为验证想法,做试验如下:
新建一个批处理:
@echo off
if "%~x1"=="" goto no
echo "%~x1"
pause
:no
echo 这个一个文件夹!
pause
如果是普通文件夹,拖放到这个批处理上面会显示”这是一个文件夹!“一点问题没有;
但是如果我现在建一个文件夹,取名为“test.txt.jpg"
那么CMD会取得扩展名.jpg,然而事实上文件夹是不存在扩展名一说的,从而验证了我前面的猜测是对的,即CMD的扩展名判断方法并不完美。
此外也搜到了一些别的脚本取扩展名的方法,比如VBS和JS,似乎都是用最后一个”.“作为分隔符判断,同样也必然存在这种局限性。有没有别的更完美的方法呢?
我们拭目以待,期待高手的出现!作者: HAT 时间: 2008-7-17 09:32 区分文件夹和文件的方法有很多,为什么偏偏要使用扩展名来判断呢?作者: jingyu57 时间: 2008-7-17 11:02
Quote:
Originally posted by HAT at 2008-7-17 09:32 AM:
区分文件夹和文件的方法有很多,为什么偏偏要使用扩展名来判断呢?