中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » GOTO:EOF新人还不会用的请看这里
作者:
标题: GOTO:EOF新人还不会用的请看这里 上一主题 | 下一主题
YoDe
中级用户




积分 224
发帖 102
注册 2007-11-9
状态 离线
『楼 主』:  GOTO:EOF新人还不会用的请看这里

本文来自死性不改的网志 http://www.clxp.net.cn 转载请保留此申明!

关于同一批处理使用多个同样的命令,把这个用了多次的批处理改为一个子程序,用 call调用。
具体写法是
goto :eof
:一个标记
批处理内容
goto :eof
调用子程序的方法是
call :一个标记

另外要注意,子程序要放到脚本的最后,如果有多个子程序用:标记来划分就可以了。
如果是同一个功能的命令的话,可以放到一个子程序里,如果是不同功能的命令的话要放两个子程序


例1:
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
此例子视为同一个功能的命令,那么就写
goto :eof
:结束程序(这是注释哈,自己随便定义的,这就是那个标记)
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
goto :eof
这就是一段同一个功能的命令并连续执行的子程序。。。
在使用的时候直接用 call :结束程序 来调用此段子程序。


那么另一段功能不同,而且也是一个同一批处理使用多次的命令要组成子程序就要用goto :eof分隔开,
并用:标记,来区分。


例2:
下面这段代码我用了多次
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
这段代码也用了多次
md c:\1.txt
md c:\2.txt
md c:\3.txt
但是并不是结束完程序,就开始建立文件,中间还有其他语句,那么把他们改为子程序来调用如何写呢?看下面
goto :eof
:结束程序
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
goto :eof(不同功能的子程序要用goto :eof来分隔一下,用:标记来区分。)
:建立文件
md c:\1.txt
md c:\2.txt
md c:\3.txt
goto :eof

调用子程序的时候用 call :标记 来使用,
比如
call :结束程序
call :建立文件

为什么两个都是常用的命令,却要用goto :eof 来分隔开呢。。
当然是有原因的了。。因为这两段程序“结束程序”和“建立文件”两个子程序,是在同一个批处理里用了好多次。
但是他们并不是同时使用的,也就是说,并不是结束完程序,就建立文件,而是结束完程序,还有其他内容。然后
又用到建立文件,所以要用goto :eof来分隔一下。

普通的跳转goto 执行跳转是直接 goto 标记
但是子程序调用是 goto :标记 标记前面多了个冒号。。所以要注意。。。

表达的不是很明白,有点晕哈~~
写个完整的例子看看吧。
对照例1的
ping 192.168.0.1
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
ping 192.168.0.2
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
ping 192.168.0.3
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
exit
批处理的意思就是
ping完192.168.0.1 后,关闭程序1.exe 2.exe 3.exe 、
ping完192.168.0.2 后,关闭程序1.exe 2.exe 3.exe 、
ping完192.168.0.3 后,关闭程序1.exe 2.exe 3.exe 、
退出

那么“关闭程序1.exe 2.exe 3.exe”这段代码在同一程序里用了3次,写这么长,多麻烦。。那么我们给他加进
子程序里去....

ping 192.168.0.1
call :结束程序
ping 192.168.0.2
call :结束程序
ping 192.168.0.3
call :结束程序
exit

goto :eof
:结束程序
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
goto :eof

使用子程序,和不使用子程序的代码,看起来有没有规范些,清爽些呢?
这只是简单的脚本,如果是一个很麻烦的命令,一个脚本里用了N次,如果每次都写同样的代码,,会很烦的,所以
还是建议大家在同一个批处理使用过多次的命令或语句,就搞成子程序来调用好了。

刚才例2就有点麻烦了。。。写下看看。
ping 192.168.0.1
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
ping 192.168.0.2
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
ping 192.168.0.3
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
ping 192.168.0.4
md c:\1.txt
md c:\2.txt
md c:\3.txt
ping 192.168.0.5
md c:\1.txt
md c:\2.txt
md c:\3.txt
ping 192.168.0.6
md c:\1.txt
md c:\2.txt
md c:\3.txt
exie
批处理的意思就是
ping完192.168.0.1 后,关闭程序1.exe 2.exe 3.exe 、
ping完192.168.0.2 后,关闭程序1.exe 2.exe 3.exe 、
ping完192.168.0.3 后,关闭程序1.exe 2.exe 3.exe 、
ping完192.168.0.4 后,建立名为1 2 3的三个文本 、
ping完192.168.0.5 后,建立名为1 2 3的三个文本 、
ping完192.168.0.6 后,建立名为1 2 3的三个文本 、
退出

这个就看出麻烦来了吧。。。
那好,,把用了N次的命令写进子程序里

ping 192.168.0.1
call :结束程序
ping 192.168.0.2
call :结束程序
ping 192.168.0.3
call :结束程序
ping 192.168.0.4
call :建立文件
ping 192.168.0.5
call :建立文件
ping 192.168.0.6
call :建立文件
exit

goto :eof
:结束程序
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
goto :eof
:建立文件
md c:\1.txt
md c:\2.txt
md c:\3.txt
goto :eof
我都看懂了蛤 你们不会还不会吧 蛤蛤 终于明白了GOTO:EOF的用法 希望 和我一样迷糊的朋友学会蛤

2007-12-9 23:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 2 楼』:  

http://www.cn-dos.net/forum/view ... ge=1&highlight=



第一高手    第二高手

2007-12-9 23:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
YoDe
中级用户




积分 224
发帖 102
注册 2007-11-9
状态 离线
『第 3 楼』:  

fastslz
兄干嘛哦 我是发贴给跟我一样的新人的 没有比这帖子更明白的了 呵呵

2007-12-10 04:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
windowsxphao
初级用户





积分 25
发帖 14
注册 2006-11-2
状态 离线
『第 4 楼』:  

感谢楼主,对我了解goto :eof 是一篇很好的帖子

2008-3-5 07:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jdshaw
新手上路





积分 11
发帖 6
注册 2008-7-12
状态 离线
『第 5 楼』:  

好像有没有goto :eof结果都一样的?

2008-7-12 13:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
sparklt
初级用户




积分 22
发帖 15
注册 2008-6-23
状态 离线
『第 6 楼』:  

又学会了一点:
普通的跳转goto 执行跳转是直接 goto 标记
但是子程序调用是 goto :标记 标记前面多了个冒号。。所以要注意。。。



一起蹲坑
2008-7-14 13:32
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 7 楼』:  to 6楼

所有的跳转最好都使用冒号,以前有人讨论过。



2008-7-14 14:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dslz666
中级用户





积分 233
发帖 117
注册 2007-11-28
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by jdshaw at 2008-7-12 01:28 PM:
好像有没有goto :eof结果都一样的?

不会吧,有没有goto :eof结果都一样的

我怀疑这位兄弟都没仔细看楼主转来的文章,

2008-7-24 15:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
smyhcf
新手上路





积分 18
发帖 7
注册 2008-7-24
状态 离线
『第 9 楼』:  

看不懂,,跳来跳去.跳晕了..希望LZ能说简单点,照顾一下我们这些新人

2008-7-27 01:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dos295730797
新手上路





积分 11
发帖 6
注册 2011-1-1
来自 河北石家庄
状态 离线
『第 10 楼』:  

呵呵,一步一步来吧兄弟,哪儿不懂就上网查哪儿,沉下心来学习才能学会。

2011-1-6 11:22
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (295730797)  编辑帖子  回复  引用回复
ylsmjh
新手上路





积分 1
发帖 1
注册 2011-1-5
状态 离线
『第 11 楼』:  

没怎么看懂
goto:eof 的功能是,
Call子程序后, 返回Call处

2011-1-6 13:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zaixinxiangnian
初级用户





积分 151
发帖 106
注册 2009-10-9
来自 河南省
状态 离线
『第 12 楼』:  

是这篇让我学会了GOTO :EOF

2011-1-14 22:36
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (657614933)  编辑帖子  回复  引用回复

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


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



论坛跳转: