标题: [其他] [已解决]当达到条件后,如何直接就跳出批处理for循环?谢谢! [打印本页]
作者: changedirectory 时间: 2014-6-20 15:51 标题: [已解决]当达到条件后,如何直接就跳出批处理for循环?谢谢!
1.在for循环中的do后面使用goto,当符合条件的时候,需要执行完for前面的,才能跳出for循环。
2.在for循环中使用exit /b也需要执行完for前面的,才能跳出for- echo Test
- call :loop
- echo %errorlevel%
- pause&exit
-
- :loop
- 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 - @echo off
- for /f "skip=9 delims=" %%i in (a.txt) do (
- echo,%%i
- goto :next
- )
-
- :next
- 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- @echo off
- (for /l (9 -1) do set "line="&set/p line=)<a.txt
- echo %line%
复制代码
batch+js- @set @n=0;/*&echo off
- for /f "delims=" %%a in ('cscript -nologo -e:jscript %0 10 ^<a.txt') do set line=%%a
- if defined line echo %line%
- pause&exit/b
-
- */
- if(WSH.Arguments.length)
- for(i=WSH.Arguments(0);--i;)WSH.StdIn.SkipLine()
-
- if(!WSH.StdIn.AtEndOfStream)
- WSH.Echo(WSH.StdIn.ReadLine())
-
- WSH.Quit()
复制代码
sed复制代码
gawk- gawk "NR==10{print;exit}" a.txt
复制代码
perl- open(IN,'a.txt');
- print ((<IN>)[10]);
- close(IN);
复制代码
如果文件太大,写成这样更合理:- open(IN,'a.txt');
- foreach(<IN>){
- if($length++==10){print;break;}
- }
- close(IN);
复制代码
powershell- (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
- $文件内容 = Get-Content -ReadCount 0 a.txt
- foreach ($temp in $文件内容 )
- {
- #上面那个大括号是for,foreach开头
- if ($temp -eq "aaa")
- {
- continue
- }
- if ($temp -eq "bbb")
- {
- break
- }
- echo $temp
- #下面那个大括号是 for foreach结束。
- }
- 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行 去文件最后行- @echo off
- (for /l %%i in (1 1 10) do set/p line=)<a.txt
- echo %line%
- pause
复制代码
作者: CrLf 时间: 2014-6-21 17:45
回复 15# changedirectory
笔误漏了一个 &,已修改...
--------------------------------------------------------------- set/p line=<a.txt
- rem 读 a.txt 第一行
-
- (set/p line=
- set/p line=)<a.txt
- rem 读 a.txt 第二行
复制代码
--------------------------------------------------------------- (for /l (9 -1) do set "line="&set/p line=)<a.txt
复制代码
这里的 for /l (9 -1) do 是 for /l (9 -1 0) do 的简写,其效果等价于- (for /l (1 1 10) do set "line="&set/p line=)<a.txt
复制代码
也就是循环十次,因为 set/p line= 接收到空行时不会修改 %line%,所以用 set "line=" 先将 line 设为空。
如果a.txt 前 10 行都不为空,则等价于- (set/p line=
- set/p line=
- set/p line=
- set/p line=
- set/p line=
- set/p line=
- set/p line=
- set/p line=
- set/p line=
- 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://www.bathome.net/) |
Powered by Discuz! 7.2 |