[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
忍了半个月,今天来看看大家。
大量使用 goto不是好的程序?这个结论有点绝对,好不好要看使用环境和条件,不管三七二十一就用当然不好,但在该用时不用就更不好,特别是在一些大量重复代码情况下,不大量使用跳转语句就意味着使用大量重复代码,造成语句臃肿。
就楼主的问题,用‘’&‘’可能解决问题,致于原因就大大们解释比较好。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

本帖最后由 cjiabing 于 2011-4-28 14:10 编辑

以前没注意看到这个问题,确实有点……
不过,我想大大们应该可以解释,这似乎是FOR  /L的预处理吧。
在第一个命令时没见它进行预处理,只对第一个数字进行了排序,它按照原过程进行。而在第二行它就进入对所有数字的 FOR /L 分析了,这种分析似乎不受其它命令的控制,用&无效,|也解释不了。
call可以解释,但call本身有点特殊,况且,每个call都意味着设置一个返回命令,比如goto :eof,否则,cmd就会一直挂着这个call的名字。
一直想写一篇关于中止批处理过程的文章的,可惜没空。
从楼主的代码看,楼主这样用一个for产生一个100000000位的数字,然后只取第一个数字就自动跳出(goto),显然楼主的思路也是缺乏效率的,简直是浪费。
goto 的本意是跳出、跳至,我们通常认为它是有去无回的。
而call的常用来调用、呼叫某程序,呼叫完了它遇到goto :eof时自动返回,如果没有goto :eof似乎它就一直挂在那里,除非遇到其它退出命令。
在for中,试图跳出for循环,再想跳回来,那只能用call。用goto是回不来的。而试图用goto中止进程,需要if等的判断。
在for /l中,即使没有任何多余命令,直接goto也无法阻止该命令进行预处理。在for中,我们通常这样理解,首先从集合中挑选因素处理,然后执行do后面的命令。这个过程反复进行,直到for中的内容被抽取完毕。但在for /l中,这个解释似乎站不住脚,因为for /l更像一次性从集合中抽取元素,然后才逐个去执行do后面的命令。试验如下:
  1. @echo off
  2. for /L %%i in (2,2,103333333333333) do goto end
  3. echo.
  4. echo   game over
  5. echo.
  6. pause
  7. exit
  8. :end
  9. echo.
  10. echo   SORRY! STOP!
  11. echo.
  12. pause
复制代码
然后将goto end换成pause,该命令又变回正常的for过程。看来,这个又是具体命令的区别了。cmd常把命令划成三五六等,然后给它们赋予不同的优先权。
在这里看来,只要不跳出for/l的进程,命令是不会出错的,否则for/l死活都要吃完那点草。这是从上面推理下来,唯一合理的解释。
  1. for /L %%i in (2,2,1033333) do (
  2. echo %%i
  3. dir
  4. )
复制代码
再补充一点:
是不是cmd把 for/l和call捆绑到一起了,也就是专门给call预留了空间?
只要for/l跳出进程,for/l就会进入具体的全面的预处理(前面没有进行的),然后设定一个点,以期call出去后能够找到这个回来的点。所以,我们就看到,for /l在跳出前进行了全部处理。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

返回列表