Board logo

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

作者: changedirectory    时间: 2014-6-20 15:51     标题: [已解决]当达到条件后,如何直接就跳出批处理for循环?谢谢!

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循环?谢谢!
作者: DAIC    时间: 2014-6-20 16:20

不要使用 for /l 就行啦
作者: changedirectory    时间: 2014-6-20 16:47

回复 2# DAIC


    如果使用for提取txt文件中一行,如果找到这行后,就直接退出for循环,如何实现这个?谢谢!
作者: DAIC    时间: 2014-6-20 17:27

回复 3# changedirectory


    请给段文本,说清楚获取哪一行。
作者: changedirectory    时间: 2014-6-20 18:37

回复 4# DAIC


    比如一个文本,里面有几万行,我就想取其中的第10行,然后退出for循环,显示第10行的内容。
  如果等待for循环完,时间会很长的。想取到第10行后就直接退出for
作者: PowerShell    时间: 2014-6-20 18:53

本帖最后由 PowerShell 于 2014-6-20 18:58 编辑

这其实是早期bat for的简陋,现在的for,比如powershell,都有【终止当前循环--continue】【退出循环-break】2个出口,供使用。
bat 没有的话,只能用goto构造出,这两个出口。------不用代码照样可以授人以渔,让你即会bat,又会ps。
作者: DAIC    时间: 2014-6-20 20:49

回复 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
复制代码

作者: DAIC    时间: 2014-6-20 20:50

回复 6# PowerShell


你写一个取第10行的ps1代码给楼主学习一下吧
作者: changedirectory    时间: 2014-6-20 20:55

回复 7# DAIC


    你这个取完第10行,do前面的for语句应该还会执行吧。请前辈在指点迷津。
作者: DAIC    时间: 2014-6-20 21:07

回复 9# changedirectory


    你找一个几万行的文件,再找一个几十行的文件,分别测试一下,看看需要多长时间。
作者: CrLf    时间: 2014-6-20 21:18

本帖最后由 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]
复制代码

作者: changedirectory    时间: 2014-6-20 21:36

回复 11# CrLf


    能给解释下bat写的代码的意思吗?谢谢
作者: CrLf    时间: 2014-6-20 22:03

回复 12# changedirectory


    用 10 次 set/p 依次取文件前 10 行,如果最后一次取值不为空则将其显示
作者: PowerShell    时间: 2014-6-21 14:09

回复  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命令。
作者: changedirectory    时间: 2014-6-21 15:44

回复 13# CrLf


    还是不明白前辈的写的bat。看不明白,请前辈不要惜字如金,详细的给介绍下
作者: changedirectory    时间: 2014-6-21 15:45

回复 14# PowerShell


    谢谢。现在还不会ps.如果有好的教程,请给推荐下
作者: terse    时间: 2014-6-21 17:18

回复 15# changedirectory
C版 代码里字符难道给吃了 下面这个看得比较清楚了吧
文件少于10行 去文件最后行
  1. @echo off
  2. (for /l %%i in (1 1 10) do set/p line=)<a.txt
  3. echo %line%
  4. pause
复制代码

作者: CrLf    时间: 2014-6-21 17:45

回复 15# changedirectory


笔误漏了一个 &,已修改...
--------------------------------------------------------------
  1. set/p line=<a.txt
  2. rem 读 a.txt 第一行
  3. (set/p line=
  4. set/p line=)<a.txt
  5. rem 读 a.txt 第二行
复制代码
--------------------------------------------------------------
  1. (for /l (9 -1) do set "line="&set/p line=)<a.txt
复制代码
这里的 for /l (9 -1) do 是 for /l (9 -1 0) do 的简写,其效果等价于
  1. (for /l (1 1 10) do set "line="&set/p line=)<a.txt
复制代码
也就是循环十次,因为 set/p line= 接收到空行时不会修改 %line%,所以用 set "line=" 先将 line 设为空。
如果a.txt 前 10 行都不为空,则等价于
  1. (set/p line=
  2. set/p line=
  3. set/p line=
  4. set/p line=
  5. set/p line=
  6. set/p line=
  7. set/p line=
  8. set/p line=
  9. set/p line=
  10. set/p line=)<a.txt
复制代码
也就是依次读取 a.txt  的前十行
--------------------------------------------------------------
一般来说处理文件的时候,自己用的话最好的选择还是 gawk/sed/perl,给别人用建议用 vbs 或 js 或 bat+js,是最通用的方案且效率不低
win 下的 shell 本职不是处理文本,linux 军团才是这方面的专家
gawk 4.02  ----  156K
sed 4.2.2 ----  76K
perl 5.16.2  ----  (exe+dll = 393K+1339K)
作者: changedirectory    时间: 2014-6-23 09:43

非常感谢所有人的回答!




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2