|  | 
 
| dnawo 初级用户
 
   
 
 
 
 积分 38
 发帖 13
 注册 2008-4-24
 状态 离线
 | 
| 『楼 主』:
 [总结]call和goto的异同点
 
使用 LLM 解释/回答一下 
 
 
@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 ] 
 
 
 
 |  | 
|  2008-4-25 23:06 |  | 
|  | 
 
| pusofalse 银牌会员
 
      
 
 
 积分 1604
 发帖 646
 注册 2008-4-13
 状态 离线
 |  | 
|  2008-4-25 23:17 |  | 
|  | 
 
| plp626 银牌会员
 
      钻石会员
 
 
 积分 2278
 发帖 1020
 注册 2007-11-19
 状态 离线
 | 
| 『第 3 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
很好,新手有福了,我在补充句:goto比call速度稍快点。
 
 当然call的用处简直太多了,
 for,if,call,setlocal,goto,set,echo,
 这7个命令结合着灵活运用,哪不容易,
 多进程时还有个start,呵呵,大家都不太用,其实强大着呢。。。
 
 
 
 
 
 |  
                  |  山外有山,人外有人;低调做人,努力做事。
 
 进入网盘(各种工具)~~ 空间~~cmd学习
 |  | 
|  2008-4-25 23:17 |  | 
|  | 
 
| pusofalse 银牌会员
 
      
 
 
 积分 1604
 发帖 646
 注册 2008-4-13
 状态 离线
 |  | 
|  2008-4-25 23:21 |  | 
|  | 
 
| dnawo 初级用户
 
   
 
 
 
 积分 38
 发帖 13
 注册 2008-4-24
 状态 离线
 |  | 
|  2008-4-25 23:21 |  | 
|  | 
 
| dnawo 初级用户
 
   
 
 
 
 积分 38
 发帖 13
 注册 2008-4-24
 状态 离线
 | 
| 『第 6 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
Originally posted by pusofalse at 2008-4-25 11:21 PM:谁能发篇专门讲解call的详细又详细的文章~?我等新手感激不尽啊~
 
期待高手来,我也是这几天学学批处理,做些总结^_^ 
 
 
 
 |  | 
|  2008-4-25 23:46 |  | 
|  | 
 
| bat-zw 金牌会员
 
       永远的学习者
 
 
 积分 3105
 发帖 1276
 注册 2008-3-8
 状态 离线
 | 
| 『第 7 楼』:
 我来讲几句:
 
使用 LLM 解释/回答一下 
 
 
&&首先楼主能养成总结的习惯是很好的,知识就是这样积累和巩固的; 
其次做如下说明: 
  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
 |  | 
|  2008-4-26 12:11 |  | 
|  | 
 
| moniuming 银牌会员
 
      永远的菜鸟
 
 
 
 积分 1335
 发帖 574
 注册 2007-11-27
 来自 广西
 状态 离线
 | 
| 『第 8 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
@echo off
 set "a=cn-dos"
 set "b=a"
 set "c=b"
 set "d=c"
 call call call echo %%%%%%%%%%%%%%%d%%%%%%%%%%%%%%%
 echo.
 pause
 
 
 
 
 |  | 
|  2008-4-26 12:40 |  | 
|  | 
 
| bat-zw 金牌会员
 
       永远的学习者
 
 
 积分 3105
 发帖 1276
 注册 2008-3-8
 状态 离线
 | 
| 『第 9 楼』:
 再来个简单点的实例:
 
使用 LLM 解释/回答一下 
 
 
@echo offcall :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
 |  | 
|  2008-4-26 13:51 |  | 
|  | 
 
| bat-zw 金牌会员
 
       永远的学习者
 
 
 积分 3105
 发帖 1276
 注册 2008-3-8
 状态 离线
 | 
| 『第 10 楼』:
 再来个call延时的用法:
 
使用 LLM 解释/回答一下 
 
 
&&运行代码一,我们并不能得到想要的结果“cn-dos.net”,而是会显示为“%str:~4%”,这是为什么呢?因为在cmd中存在预处理机制,在读取echo %%str:~%n%%%这句的时候,先是迫不及待地脱去最外层的%符,变为了echo  %str:~%n%%,在这里第二层的%就变成了字符%了,自然就显示为“%str:~4%”了,而要如何解决这个问题呢?我们就可用到call的延时作用了,通过call延时后,cmd就会一层层脱去%并解释%里面的变量,如运行代码二就能正确显示为“cn-dos.net”了。 @echo offset str=www.cn-dos.net
 set n=4
 echo %%str:~%n%%%
 pause>nul
 
 @echo offset 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
 |  | 
|  2008-4-26 14:23 |  | 
|  | 
 
| dnawo 初级用户
 
   
 
 
 
 积分 38
 发帖 13
 注册 2008-4-24
 状态 离线
 | 
| 『第 11 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
@echo off是表示关闭所有回显(包括@echo off这句),所以在这句后面除非出现了echo on,后面所有的语句是不要加"@"的;
 
没注意到,感谢提醒 
 
 
 
 |  | 
|  2008-4-26 17:10 |  | 
|  | 
 
| dslz666 中级用户
 
    
 
 
 
 积分 233
 发帖 117
 注册 2007-11-28
 状态 离线
 |  | 
|  2008-4-28 05:11 |  | 
|  | 
 
| bjsh 银牌会员
 
      
 
 
 
 积分 2000
 发帖 621
 注册 2007-1-1
 状态 离线
 | 
| 『第 13 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
call call call echo %%%%%%%%%%%%%%%d%%%%%%%%%%%%%%%
 
 类似与这种用法的 实际上call类似与 shell 里的 eval 强制cmd再次扫描命令
 
 用的巧的话 有妙用哦。
 
 
 
 
 |  | 
|  2008-4-28 17:01 |  | 
|  | 
 
| jfm034 新手上路
 
  
 
 
 
 积分 16
 发帖 8
 注册 2006-12-7
 状态 离线
 |  | 
|  2008-4-29 17:36 |  | 
|  | 
 
| xvzheng 新手上路
 
  
 
 
 
 积分 14
 发帖 7
 注册 2008-4-29
 状态 离线
 |  | 
|  2008-4-29 23:23 |  |