中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 双重FOR循环中如何只退出第二层循环
作者:
标题: 双重FOR循环中如何只退出第二层循环 上一主题 | 下一主题
bd123456789
中级用户





积分 360
发帖 216
注册 2007-5-29
状态 离线
『楼 主』:  双重FOR循环中如何只退出第二层循环

双重FOR循环中如何在一定条件下退出第二层循环,并继续执行第一层循环
我有两个文件,可附件下载
1.txt
19 2 8 8 8.168 888.0888.1888
19 3 8 8 8.178 888.0888.1888
19 4 8 8 8.188 888.0888.1888
19 5 8 8 8.198 888.0888.1888
19 6 8 8 8.108 888.0888.1888
2.txt
19 7 8 8 8.168 888.0888.1888
19 8 8 8 8.178 888.0888.1888
19 9 8 8 8.188 888.0888.1888
19 0 8 8 8.198 888.0888.1888
19 1 8 8 8.108 888.0888.1888
提取.bat
for %%f in (*.txt) do (
type %%f
setlocal enabledelayedexpansion
set p=0
FOR /F "tokens=1,2" %%a IN (%%f) DO (
              set /a p=!p!+1
                echo %%a%%b >>输出.txt
if !p! equ 3 goto:eof            →注意这句
)
)
pause
我的目的是提取两个文本的前三行的指定的字符,所以在对第一次循环中,在读取1.txt前三行时退出对1.txt的循环操作,但是继续执行外层循环,以开始对2.txt进行处理,也并只读取它的前三行,然后结束
问题:
上述代码运行后,只显示文本1前三行相应的内容,而并没有处理文本2的内容?
主要想法:
是不是我在FOR循环中直接使用GOTO:EOF,将退出所有的循环
有什么好的办法,使只退出第二层循环,而继续执行外层循环!!!!
请教高手

[ Last edited by bd123456789 on 2007-7-9 at 05:16 PM ]

附件 1: 试验文件.rar (2007-7-9 17:14, 458 bytes,下载次数: 10)
2007-7-9 17:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 2 楼』:  

因为在执行第一个文件时,有一个goto :EOF,这将导致退出批处理,所以只有第一个文件的处理结果。

试试下面这个?
@echo off
for %%f in (1.txt 2.txt) do (
type %%f
setlocal enabledelayedexpansion
set p=0
        FOR /F "tokens=1,2" %%a IN (%%f) DO (
                set /a p=!p!+1
                if !p! leq 3 echo %%a%%b >>输出.txt
        )
)
pause


2007-7-9 18:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bd123456789
中级用户





积分 360
发帖 216
注册 2007-5-29
状态 离线
『第 3 楼』:  

多谢了
你讲的方法是可行的,不过其适用性不太强,如果能够使用GOTO

语句就可能更好了,不过,我找不到答案,呵呵!

2007-7-9 19:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 4 楼』:  

也可以goto的。

2007-7-9 20:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 5 楼』:  


@echo off
for %%f in (1.txt 2.txt) do (call :okay %%f)
pause&exit/b

:okay
setlocal enabledelayedexpansion
set p=0
        FOR /F "tokens=1,2" %%a IN (%1) DO (
                set /a p=!p!+1
                echo %%a%%b >>输出.txt
                if !p! equ 3 goto :eof
        )


2007-7-9 20:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bd123456789
中级用户





积分 360
发帖 216
注册 2007-5-29
状态 离线
『第 6 楼』:  

高招!

把我的双重循环,通过调用变成了单个循环执行,然后...

我查阅了一些资料

据说在FOR循环中如果使用GOTO,将中止所有嵌套的循环

也就是说FOR循环在一定条件下中途不得退出!

但你的拆分调用方法,化解了这一矛盾

测试正确!

[ Last edited by bd123456789 on 2007-7-9 at 10:01 PM ]

2007-7-9 21:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: