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

[其他] [已解决]当达到条件后,如何直接就跳出批处理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循环?谢谢!
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

不要使用 for /l 就行啦

TOP

回复 2# DAIC


    如果使用for提取txt文件中一行,如果找到这行后,就直接退出for循环,如何实现这个?谢谢!

TOP

回复 3# changedirectory


    请给段文本,说清楚获取哪一行。

TOP

回复 4# DAIC


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

TOP

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

这其实是早期bat for的简陋,现在的for,比如powershell,都有【终止当前循环--continue】【退出循环-break】2个出口,供使用。
bat 没有的话,只能用goto构造出,这两个出口。------不用代码照样可以授人以渔,让你即会bat,又会ps。
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

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

TOP

回复 6# PowerShell


你写一个取第10行的ps1代码给楼主学习一下吧

TOP

回复 7# DAIC


    你这个取完第10行,do前面的for语句应该还会执行吧。请前辈在指点迷津。

TOP

回复 9# changedirectory


    你找一个几万行的文件,再找一个几十行的文件,分别测试一下,看看需要多长时间。

TOP

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

TOP

回复 11# CrLf


    能给解释下bat写的代码的意思吗?谢谢

TOP

回复 12# changedirectory


    用 10 次 set/p 依次取文件前 10 行,如果最后一次取值不为空则将其显示

TOP

回复  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命令。
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

回复 13# CrLf


    还是不明白前辈的写的bat。看不明白,请前辈不要惜字如金,详细的给介绍下

TOP

返回列表