找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 89738|回复: 18

[其他] [已解决]当达到条件后,如何直接就跳出批处理for循环?谢谢!

[复制链接]
发表于 2014-6-20 15:51:03 | 显示全部楼层 |阅读模式
1.在for循环中的do后面使用goto,当符合条件的时候,需要执行完for前面的,才能跳出for循环。
2.在for循环中使用exit /b也需要执行完for前面的,才能跳出for

  1. echo Test
  2. call :loop
  3. echo %errorlevel%
  4. pause&exit

  5. :loop
  6. for /l %%i in (1 1 10000000) do if %%i==2 exit /b %%i
复制代码
如何当达到条件后,不再执行for循环而直接就跳出for循环?谢谢!

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2014-6-20 16:20:45 | 显示全部楼层
不要使用 for /l 就行啦
 楼主| 发表于 2014-6-20 16:47:59 | 显示全部楼层
回复 2# DAIC


    如果使用for提取txt文件中一行,如果找到这行后,就直接退出for循环,如何实现这个?谢谢!
发表于 2014-6-20 17:27:34 | 显示全部楼层
回复 3# changedirectory


    请给段文本,说清楚获取哪一行。
 楼主| 发表于 2014-6-20 18:37:49 | 显示全部楼层
回复 4# DAIC


    比如一个文本,里面有几万行,我就想取其中的第10行,然后退出for循环,显示第10行的内容。
  如果等待for循环完,时间会很长的。想取到第10行后就直接退出for
发表于 2014-6-20 18:53:59 | 显示全部楼层
本帖最后由 PowerShell 于 2014-6-20 18:58 编辑

这其实是早期bat for的简陋,现在的for,比如powershell,都有【终止当前循环--continue】【退出循环-break】2个出口,供使用。
bat 没有的话,只能用goto构造出,这两个出口。------不用代码照样可以授人以渔,让你即会bat,又会ps。
发表于 2014-6-20 20:49:29 | 显示全部楼层
回复 5# changedirectory
  1. @echo off
  2. for /f "skip=9 delims=" %%i in (a.txt) do (
  3.     echo,%%i
  4.     goto :next
  5. )

  6. :next
  7. pause
复制代码
发表于 2014-6-20 20:50:08 | 显示全部楼层
回复 6# PowerShell


你写一个取第10行的ps1代码给楼主学习一下吧
 楼主| 发表于 2014-6-20 20:55:11 | 显示全部楼层
回复 7# DAIC


    你这个取完第10行,do前面的for语句应该还会执行吧。请前辈在指点迷津。
发表于 2014-6-20 21:07:01 | 显示全部楼层
回复 9# changedirectory


    你找一个几万行的文件,再找一个几十行的文件,分别测试一下,看看需要多长时间。
发表于 2014-6-20 21:18:32 | 显示全部楼层
本帖最后由 CrLf 于 2014-6-21 18:02 编辑

针对大文件:

batch
  1. @echo off
  2. (for /l (9 -1) do set "line="&set/p line=)<a.txt
  3. echo %line%
复制代码
batch+js
  1. @set @n=0;/*&echo off
  2. for /f "delims=" %%a in ('cscript -nologo -e:jscript %0 10 ^<a.txt') do set line=%%a
  3. if defined line echo %line%
  4. pause&exit/b

  5. */
  6. if(WSH.Arguments.length)
  7.         for(i=WSH.Arguments(0);--i;)WSH.StdIn.SkipLine()

  8. if(!WSH.StdIn.AtEndOfStream)
  9.         WSH.Echo(WSH.StdIn.ReadLine())

  10. WSH.Quit()
复制代码
sed
  1. sed 10!d;q a.txt
复制代码
gawk
  1. gawk "NR==10{print;exit}" a.txt
复制代码
perl
  1. open(IN,'a.txt');
  2. print ((<IN>)[10]);
  3. close(IN);
复制代码
如果文件太大,写成这样更合理:
  1. open(IN,'a.txt');
  2. foreach(<IN>){
  3.         if($length++==10){print;break;}
  4. }
  5. close(IN);
复制代码
powershell
  1. (Get-Content -TotalCount 10 a.txt)[-1]
复制代码
 楼主| 发表于 2014-6-20 21:36:06 | 显示全部楼层
回复 11# CrLf


    能给解释下bat写的代码的意思吗?谢谢
发表于 2014-6-20 22:03:55 | 显示全部楼层
回复 12# changedirectory


    用 10 次 set/p 依次取文件前 10 行,如果最后一次取值不为空则将其显示
发表于 2014-6-21 14:09:44 | 显示全部楼层
回复  PowerShell


你写一个取第10行的ps1代码给楼主学习一下吧
DAIC 发表于 2014-6-20 20:50
  1. $文件内容 = Get-Content -ReadCount 0    a.txt
  2. foreach  ($temp in $文件内容 )
  3. {
  4. #上面那个大括号是for,foreach开头
  5.     if ($temp  -eq "aaa")
  6.    {
  7.         continue   
  8.   }
  9.     if ($temp  -eq "bbb")
  10.   {
  11.       break
  12.   }
  13.   echo  $temp
  14. #下面那个大括号是 for foreach结束。
  15. }
  16. echo "上一个for,foreach结束了,我是脚本中的下一行"
复制代码
continue的作用是 ,相当于goto到最下面的大括号里面,也就是for ,foreach的里面,那么,下一次for将开始。
break的作用是,相当于goto到最下面的大括号外!面,也就是for ,foreach的外面,那么,下一条脚本命令将开始。
脚本运行结果是
从第一行到最后一行,如果遇到字符串aaa则不显示,如果遇到字符串bbb则结束函数,如果上面两个条件都达不到,则通过【echo  $temp】显示每一行。



结论:
楼主的需求【当达到条件后,如何直接就跳出批处理for循环?】,
1建议用powershell写脚本解决
2建议由bat调用powershell解决。即写n个ps1脚本,在bat中调用,用bat接收返回值。
3自己用goto重新构造,修改 bat的for命令。
 楼主| 发表于 2014-6-21 15:44:10 | 显示全部楼层
回复 13# CrLf


    还是不明白前辈的写的bat。看不明白,请前辈不要惜字如金,详细的给介绍下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 06:32 , Processed in 0.032611 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表