中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 再论逐行显示文本之疑问 上一主题 | 下一主题
#four#
中级用户




积分 209
发帖 34
注册 2004-5-25
状态 离线
『楼 主』:  再论逐行显示文本之疑问

本人看了关于逐行显示文本的批处理后,自已也试写了一下,发现了几个问题,希望论坛里的高手能给我解释解释。我先用下面这个批处理显示文件文本时能正确显示。
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in (1.txt) do (call;:put;"%%i")
:put
        set p=%1
        set a=0
:start
        if "!p:~%a%,1!"=="" (
        :end
                echo/&echo\
        ) else (
        set/p=!p:~%a%,1!<nul
        ping 127.1 -n 1>nul
        set /a a+=1
        goto start
        )
    对于以上批处理我是这样理解的,首先FOR语句从文件1中读取一段到变量I,然后再调用:PUT函数,在:PUT函数中把变量I的内容传给变量P,再对P的第一个字符开始判断,如果该字符变量为空,则输出一空行后,跳出:PUT函数,继续FOR循环,提取下一变量。否则逐个显示该变量中的字符(包括空格)直至该字符尾,跳出:PUT函数,继续FOR循环,提取下一变量。所以能正确地显示。然而我对以上批处理改成如下:(修改start标签的位置和加了一条判断跳转指令)
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in (1.txt) do (call;:put;"%%i")
:put
        set p=%1
        set a=0
        if "!p:~%a%,1!"=="" (
        :end
                echo/&echo\
        ) else (
        :start
                set/p=!p:~%a%,1!<nul
                ping 127.1 -n 1>nul
                set /a a+=1
                if "!p:~%a%,1!"=="" goto end
                goto start
        )
后,发现正常显示一段后,就不停的显示空行,好像不停的在执行if "!p:~%a%,1!"=="" goto end 这段代码。而我认为执行了上句判断跳转指令后输出一空行后应该跳出:PUT函数,再提取下一个字符变量。为什么会出现这样的结果,是我对这段批处理理解错误了,还是两个GOTO语句惹的祸。希望版主或其它高手能给我解答。

2006-11-22 21:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
chenall
银牌会员




积分 1276
发帖 469
注册 2002-12-23
来自 福建泉州
状态 离线
『第 2 楼』:  

在:put前放一个goto :eof
具体原因自己看看吧.



QQ:366840202
http://chenall.net
2006-11-22 21:44
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (366840202)  编辑帖子  回复  引用回复
#four#
中级用户




积分 209
发帖 34
注册 2004-5-25
状态 离线
『第 3 楼』:  

是不是:end放在else前,运行end后会继续运行else后的代码。

2006-11-22 21:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
hxuan999
中级用户

DOS之日


积分 337
发帖 161
注册 2006-11-4
状态 离线
『第 4 楼』:  



  Quote:
               if "!p:~%a%,1!"=="" goto end



  Quote:
       if "!p:~%a%,1!"=="" (
        :end

这不是一样吗,为什么要多此一举的分开呢?

有错是因为:

  Quote:
        if "!p:~%a%,1!"=="" (
        :end
                echo/&echo\
        ) else (
        :start
                set/p=!p:~%a%,1!<nul
                ping 127.1 -n 1>nul
                set /a a+=1
                if "!p:~%a%,1!"=="" goto end
                goto start
        )

goto end 后并不是执行了上面的那个if语句,所以就顺序执行了.当然一直执行
if "!p:~%a%,1!"=="" goto end.

[ Last edited by hxuan999 on 2006-11-23 at 05:11 PM ]



for /f %%h in (`echo hxuan`) do for /f %%x in (`echo hxuan`) do if %%h==%%x nul
2006-11-24 05:09
查看资料  发送邮件  发短消息 网志  OICQ (33899867)  编辑帖子  回复  引用回复

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


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



论坛跳转: