中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-15 02:46
楼 主 [总结]call和goto的异同点 发表于 2008-04-25 23:06 ·  中国 福建 福州 电信
初级用户
积分 38
发帖 13
注册 2008-04-24 14:16
UID 116814
性别 男
状态 离线
@echo off

echo 早上好!
goto :noon
echo 该睡觉了!&pause>nul

:noon
echo 中午好!
:night
echo 晚上好!

pause>nul

执行结果:
早上好!
中午好!
晚上好!


@echo off

echo 早上好!
call :noon
echo 该睡觉了!&pause>nul

:noon
echo 中午好!
:night
echo 晚上好!

pause>nul

执行结果:
早上好!
中午好!
晚上好!

该睡觉了!

中午好!
晚上好!


从上边两个例子我们已经可以很明白的看出call和goto的异同点了:

相同点:call和goto都可以将流程跳转到标签处。
不同点:goto将流程跳转到标签处后,程序从标签处开始执行到结束,整个流程执行完毕;call将流程跳转到标签处后,程序从标签处开始执行到结束,然后会跳转回执行call的下一条语句,直到整个流程执行完毕;所以call并不会像goto那样打乱了流程,它只是中断了当前流程,但仍保证整个流程按原顺序进行。

在第二个例子中我们可以在标签后适当的地方调用goto :eof,使流程提前结束,提前将流程转移call的下一条语句:
@echo off

echo 早上好!
call :noon
echo 该睡觉了!&pause>nul

:noon
echo 中午好!
goto :eof
:night
echo 晚上好!
goto :eof

pause>nul

执行结果已和例二有所不同,先显示:
早上好!
中午好!
该睡觉了!

按任意键后接着显示"中午好!",到goto :eof后退出!
很显然,如果在例一中加入goto :eof则只是提前结束了流程。

[ Last edited by dnawo on 2008-4-28 at 02:14 PM ]
2 发表于 2008-04-25 23:17 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
UID 115804
性别 男
状态 离线
顶!~ call的用法不止这些,感觉最难的就是call了
3 发表于 2008-04-25 23:17 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
UID 103127
性别 男
状态 离线
很好,新手有福了,
我在补充句:goto比call速度稍快点。

当然call的用处简直太多了,
for,if,call,setlocal,goto,set,echo,
这7个命令结合着灵活运用,哪不容易,
多进程时还有个start,呵呵,大家都不太用,其实强大着呢。。。
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
4 发表于 2008-04-25 23:21 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
UID 115804
性别 男
状态 离线
谁能发篇专门讲解call的详细又详细的文章~?我等新手感激不尽啊~
5 发表于 2008-04-25 23:21 ·  中国 福建 福州 电信
初级用户
积分 38
发帖 13
注册 2008-04-24 14:16
UID 116814
性别 男
状态 离线
恩,一点一滴的积累~~~~~~~~~~
6 发表于 2008-04-25 23:46 ·  中国 福建 福州 电信
初级用户
积分 38
发帖 13
注册 2008-04-24 14:16
UID 116814
性别 男
状态 离线
Originally posted by pusofalse at 2008-4-25 11:21 PM:
谁能发篇专门讲解call的详细又详细的文章~?我等新手感激不尽啊~

期待高手来,我也是这几天学学批处理,做些总结^_^
7 我来讲几句: 发表于 2008-04-26 12:11 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
UID 112398
性别 男
状态 离线
&&首先楼主能养成总结的习惯是很好的,知识就是这样积累和巩固的;
其次做如下说明:
  1、楼主在两篇帖子里都提到了goto :eof这一特殊标签,其实eof就是end of file(文件结尾)的缩写,goto :eof在批处理的意思就是跳转至程序结尾,但要注意的是如在call后的子程序中goto :eof则表示结束子程序回到父程序;
  2、除了goto :eof外goto 后面的标签名不要加":";
  3、@echo off是表示关闭所有回显(包括@echo off这句),所以在这句后面除非出现了echo on,后面所有的语句是不要加"@"的;
  4、goto一般是和if组合在一起使用的,if(not)......goto....(如果条件成立(不成立),跳转到),象楼主这样直接goto的用法确实很少;
  5、至于call的用法请楼主在论坛内多搜索,我在这里就不罗嗦了,但可以说一句:call是很强大的命令,用好它能为你带来极大的方便。
还是转个使用call命令的实例吧(请看此贴7楼的代码):http://www.cn-dos.net/forum/viewthread.php?tid=39727&fpage=2

[ Last edited by zw19750516 on 2008-4-26 at 12:17 PM ]
批处理之家新域名:www.bathome.net
8 发表于 2008-04-26 12:40 ·  中国 上海 电信
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
UID 103929
性别 男
来自 广西
状态 离线

@echo off
set "a=cn-dos"
set "b=a"
set "c=b"
set "d=c"
call call call echo %%%%%%%%%%%%%%%d%%%%%%%%%%%%%%%
echo.
pause
9 再来个简单点的实例: 发表于 2008-04-26 13:51 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
UID 112398
性别 男
状态 离线
@echo off
call :lp www . cn - dos . net
pause>nul&goto :eof
:lp
echo %1%2%3%4%5%6%7

将会显示www.cn-dos.net
这就是通过call将七个字符串传递给了子程序lp,而在子程序中则分别用%1-%7变量表示了这七个字符串。
批处理之家新域名:www.bathome.net
10 再来个call延时的用法: 发表于 2008-04-26 14:23 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
UID 112398
性别 男
状态 离线
&&运行代码一,我们并不能得到想要的结果“cn-dos.net”,而是会显示为“%str:~4%”,这是为什么呢?因为在cmd中存在预处理机制,在读取echo %%str:~%n%%%这句的时候,先是迫不及待地脱去最外层的%符,变为了echo %str:~%n%%,在这里第二层的%就变成了字符%了,自然就显示为“%str:~4%”了,而要如何解决这个问题呢?我们就可用到call的延时作用了,通过call延时后,cmd就会一层层脱去%并解释%里面的变量,如运行代码二就能正确显示为“cn-dos.net”了。
@echo off
set str=www.cn-dos.net
set n=4
echo %%str:~%n%%%
pause>nul

@echo off
set str=www.cn-dos.net
set n=4
call,echo %%str:~%n%%%
pause>nul


[ Last edited by zw19750516 on 2008-4-26 at 02:29 PM ]
批处理之家新域名:www.bathome.net
11 发表于 2008-04-26 17:10 ·  中国 福建 福州 电信
初级用户
积分 38
发帖 13
注册 2008-04-24 14:16
UID 116814
性别 男
状态 离线
@echo off是表示关闭所有回显(包括@echo off这句),所以在这句后面除非出现了echo on,后面所有的语句是不要加"@"的;


没注意到,感谢提醒
12 发表于 2008-04-28 05:11 ·  中国 广东 广州 电信
中级用户
★★
积分 233
发帖 117
注册 2007-11-28 02:38
UID 104005
性别 男
状态 离线
谢谢楼主,又进一步理解的 call 跟GOTO
13 发表于 2008-04-28 17:01 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 2,000
发帖 621
注册 2007-01-01 00:00
UID 75212
性别 男
状态 离线
call call call echo %%%%%%%%%%%%%%%d%%%%%%%%%%%%%%%


类似与这种用法的 实际上call类似与 shell 里的 eval 强制cmd再次扫描命令

用的巧的话 有妙用哦。
14 发表于 2008-04-29 17:36 ·  中国 广东 东莞 电信
新手上路
积分 16
发帖 8
注册 2006-12-07 00:46
UID 72764
性别 男
状态 离线
很强大的语句。。

唉。。要多多练习才能熟练应用
15 发表于 2008-04-29 23:23 ·  中国 江苏 南京 电信
新手上路
积分 14
发帖 7
注册 2008-04-29 22:21
UID 117324
性别 男
状态 离线
很经典!!!!!!!!!!!
论坛跳转: