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

[文本处理] [已解决]批处理for语句末尾的标签无法跳转

本人在写代码的时候经常遇见这个问题,现在才想起来发帖问问。比如,代码如下:
  1. for /f %%a (a.txt) do (
  2.   ........................
  3. .........................
  4.   if ........goto next
  5. ...........................
  6. .........................
  7. :next)
复制代码
为什么会提示此时不能有)?
有的时候在for语句里判断某个条件,当成立的时候就到for的末尾执行下一个循环,为什么标签后没有任何句子的话会报错呢。如果有句子,标签处于for语句体中间,又该需要注意什么呢?似乎嵌套一个for语句并在里层for中跳转到外层李的标签的时候,往往最外一层for只能执行一次,无法执行接下来的循环,为什么?

[ 本帖最后由 Lumiere 于 2009-7-28 23:42 编辑 ]
1

评分人数

    • keen: 感谢主动给标题标注[已解决]字样PB + 2
Still with wax

别把标签放在for循环内部
1

评分人数

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 2楼 的帖子

管理员能给我解释一下原因么,这样的话帖子结了也难看吧?呵呵
Still with wax

TOP

自顶,希望论坛的达人们早日看到并给一个详细的解答,多谢。
Still with wax

TOP

是不是if条件成立后直接运行:next后面的)了?

TOP

回复 5楼 的帖子

标签:next是在for循环体内,而且一开始如果将)作为标签的一部分的话,for的解释会出错,直接退出的,不应该是那种现象。标签应该就是一个标示性的东西,不都说相当于rem或者::么?
Still with wax

TOP

for内相当于一个组合,

set a=aaa
:next
set b=bbb

一个组合,批处理是作为一个整体的,如同:
set a=aaa&:next&set b=bbb
一样的效果,

也就是在跳转时是插不进去的!
1

评分人数

TOP

回复 7楼 的帖子

那就是说,不管单个for还是嵌套的,都不能用标签?
Still with wax

TOP

不信,试了,就知道了

TOP

回复 9楼 的帖子

没说不信啊,我就是在用的过程中遇到问题了才问撒,主要是为了弄清楚。好吧,结贴了,多谢各位前辈跟帖。
Still with wax

TOP

回复 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

回复 11楼 的帖子

兄弟,这种氛围很好,但是语言也不要“过激”,呵呵....

TOP

1

评分人数

命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

程序可以运行并不能说明是可以跳进组合内的,看看下面的代码,本来组合输出是已经转向到aa.txt的,
可是经过goto :后,就不再是输出到aa.txt,而是到屏幕了。
还有echo %%a结果也不正确,说明for令牌已经无效

goto :1到所指的标号后,批处理是重新读取程序流,已经不把后面的代码当作还在同一组合,而是重新开始一个新起点。
其原因是批处理运行的预处理机制所至,请试运行下面的代码,此代码是一个死循环,按几次空格后,再打开源码看看就会发现会在后面多了几行。可以证实批处理运行是现读现运行的。

  1. @echo off
  2. (for %%a in (aa bb) do (
  3. echo %%a 1
  4. goto 1
  5. :3
  6. echo,3333333333
  7. goto end
  8. :2
  9. echo,2222222222
  10. goto 3
  11. :1
  12. echo,1111111111
  13. goto 2
  14. :end
  15. rem end
  16. echo %%a 2
  17. )
  18. )>aa.txt
  19. set abc=echo %%abc%%^^^>^^^>%%0^^^&pause
  20. echo %abc%>>%0&pause
复制代码
1

评分人数

    • Lumiere: 严重感谢道出了问题实质PB + 9

TOP

回复 12楼 的帖子

呵呵大家都是讨论,千万别伤了和气啊。
Still with wax

TOP

返回列表