[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

回复 7楼 的帖子

拜托。自己的想法没有得到证实前请不要轻易“教”别人,不要误人子弟。
  1. @echo off
  2. for /l %%i in (1,1,10) do (
  3. set/a n+=1
  4. if "%%i" == "4" goto a3
  5. echo,%%i%%i%%i%%i%%i%%i
  6. :a3
  7. rem 不显示
  8. )
  9. echo,循环了%n%次。
  10. pause
复制代码
上面这个代码for里面就有标签,它完全可以运行。所以netbenton兄的“跳转时插不进去”论是一个笑话。
只是for循环里面用标签有局限性,即在发生第一次标签跳转时for循环将终止,也就是说for循环只循环到发生标签跳转这次为止,从上面的代码就可以看出。当%%i等于4的时候也就是第4次循环的时候发生跳转,for循终止,从而继续for后面的命令。再来看下面这个代码。
  1. @echo off
  2. (
  3. goto 1
  4. :3
  5. echo,3333333333
  6. goto end
  7. :2
  8. echo,2222222222
  9. goto 3
  10. :1
  11. echo,1111111111
  12. goto 2
  13. :end
  14. rem end
  15. )
  16. pause
复制代码
这个代码的跳转部分是用括号括起来的,其实它跟for的括号里面是一样的,批处理中好像叫做复合命令吧(记不太清楚了,这个不重要)。其实只要记住一点,括号形式的复合命令中使用标签跳转,标签后面不能直接跟右括号,上面这个代码中标签:end后面我加了一个rem命令,如果把这个rem命令去掉后运行则只是窗口一闪而过,这就是楼主所说的问题之所在,当然,这里不是说只能用rem命令,其它命令也是一样的,如用echo,来显示一个空行等,只要不影响原代码功能就可以了。
1

评分人数

    • Lumiere: 多谢回复,抛砖引玉PB + 5

TOP

回复 14楼 的帖子

我这人比较直,性格所致,如果之前言语过激请见谅。
先看下面这个代码吧。
  1. @echo off
  2. (
  3. set "a=aaaaaa"
  4. echo,%a% 1
  5. goto a
  6. :a
  7. echo,%a% 2
  8. )
  9. pause
复制代码
大家都知道在一个复合语句里面给变量赋于新的值后并不能马上使这个变量得到这个新的值(或许这样说不对,因为变量确实已经得到这个新值了,只是不能马上显示出来而已),而只有开启环境变量延迟或是批处理进行下一次预处理时才能让变量显示新值。上面这个代码是个复合语句,第一次echo时,由于批处理的预处理,此时的%a%还是空的,但经过goto标签跳转后却是让%a%得到了它的新值。所以我在这大胆的推测,是不是可以把goto理解成从一个预处理跳出来转到下一个预处理呢?这样就可以好容易的解释为什么for里面发生第一次标签跳转就会终止循环,因为跳转后批处理已经进行下一个预处理了,先前对for的预处理已经结束,也就是说for命令结束,这就是为什么netbenton兄代码中第二个echo %%a显示不正确,其实它显示的是正确的,因为跳转后for命令已经结束,而脱离了for以后的%%a只能把它当作是字符串来看了。
以上是个人愚见,有不对的地方请高人指正。

[ 本帖最后由 zljzsmzzx 于 2009-7-30 10:02 编辑 ]

TOP

返回列表