无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 6979|回复: 12
打印 上一主题 下一主题

[教程] grub4dos关键字goto|call|exit1的用法!

[复制链接]
跳转到指定楼层
1#
发表于 2011-12-5 10:24:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大部分都是ZXW大元帅教我的,当然我也是很努力的领悟!
好东西不能独享,所以就分享下,高手勿喷!

先看代码:
  1. !BAT
  2. echo $[0001] this is no call !
  3. call :2
  4. echo $[0001] this is end call !
  5. exit

  6. :1
  7. echo $[0002] this is :1 no call!
  8. call :2
  9. echo $[0002] this is :1 end call!
  10. exit

  11. :2
  12. echo $[0003] this is :2!
  13. goto :eof
复制代码
猜猜结果是什么?
上图:

结果肯定出乎大部分的预料!

不解释,将上面的代码改成:
  1. !BAT
  2. echo $[0001] this is no call !
  3. call :1
  4. echo $[0001] this is end call !
  5. exit

  6. :1
  7. echo $[0002] this is :1 no call!
  8. call :2
  9. echo $[0002] this is :1 end call!
  10. exit

  11. :2
  12. echo $[0003] this is :2!
  13. goto :eof
复制代码
再猜猜结果是什么?
上图:

为什么会这样?goto没有按你想的那样跳到批处理的结尾?
好好领悟下,明白后就可以做两件事了
1、利用这个特性来做一些巧妙的事情。
2、思考如何让goto跳到批处理的结尾?

[ 本帖最后由 hotdll 于 2011-12-5 10:31 编辑 ]
2#
 楼主| 发表于 2011-12-5 10:25:49 | 只看该作者
二、exit和exit 1
1、解释
一般情况下,被执行的语句都有返回值。g4d的语句也有返回值。标签段通常被调用,并且通常都会用exit返回被调用处。
很多时候都会用exit结束该标签段并返回被调用处。
2、exit和exit 1的返回值
exit 的返回值是 真
exit 1的返回值是 假
3、exit 1真的能终止批处理的执行吗?
答案是:通常可以,但是也可能仅仅是终止标签段的执行。

看下面的结果:
  1. !BAT
  2. echo $[0001] this is no call !
  3. call :1 || echo $[0004]ha ha ,我没有退出!
  4. echo $[0004] this is end call !
  5. exit

  6. :1
  7. echo $[0002] this is :1 no call!
  8. exit 1
复制代码


[ 本帖最后由 hotdll 于 2011-12-5 16:31 编辑 ]
回复

使用道具 举报

3#
发表于 2011-12-5 14:03:50 | 只看该作者
有点像调用子程序,而子程序执行完返回继续,为什么调用时只执行1条?
回复

使用道具 举报

4#
发表于 2011-12-5 14:20:30 | 只看该作者
一眼没看出#1楼两个图有什么不对劲。
回复

使用道具 举报

5#
发表于 2011-12-5 14:40:10 | 只看该作者
图倒是有区别。代码是一样的。<br />估计是复制前面的忘了改。

[ 本帖最后由 zxw 于 2011-12-5 14:43 编辑 ]
回复

使用道具 举报

6#
发表于 2011-12-5 14:43:38 | 只看该作者
第一个是call :2
第二个是call :1
我看着好像很正常啊。
回复

使用道具 举报

7#
 楼主| 发表于 2011-12-5 14:49:02 | 只看该作者

回复 #6 chenall 的帖子

还是c大眼尖。。。。

呵呵区别就是这个地方。

C大看着肯定正常,批处理功能就是您实现的。

不过对很多初学G4D批处理的人来说,对这个goto的结果肯定纳闷。。。。。

我当初就在这里犯迷糊了。

今天在群里问了很多人,就没几个猜对结果的。

[ 本帖最后由 hotdll 于 2011-12-5 15:00 编辑 ]
回复

使用道具 举报

8#
发表于 2011-12-5 15:30:39 | 只看该作者
汗。这个和WINDOWS批处理的机制是一样的。。

熟悉WINDOWS批处理的人自然明白。
回复

使用道具 举报

9#
 楼主| 发表于 2011-12-5 16:18:56 | 只看该作者
原帖由 chenall 于 2011-12-5 15:30 发表
汗。这个和WINDOWS批处理的机制是一样的。。

熟悉WINDOWS批处理的人自然明白。



windows的批处理
goto 我记得会跳出循环。。
g4d的不会。

另外windows 没有exit 1 也没有shift 1

[ 本帖最后由 hotdll 于 2011-12-5 16:20 编辑 ]
回复

使用道具 举报

10#
发表于 2011-12-5 16:22:17 | 只看该作者

回复 #9 hotdll 的帖子

你自己试一下不就知道了。。
退出 CMD.EXE 程序(命令解释器)或当前批处理脚本。

EXIT [/B] [exitCode]

  /B          指定要退出当前批处理脚本而不是 CMD.EXE。如果从一个
              批处理脚本外执行,则会退出 CMD.EXE

  exitCode    指定一个数字号码。如果指定了 /B,将 ERRORLEVEL
              设成那个数字。如果退出 CMD.EXE,则用那个数字设置
              过程退出代码。


更改批处理文件中可替换参数的位置。

SHIFT [/n]

如果命令扩展被启用,SHIFT 命令支持/n 命令行开关;该命令行开关告诉
命令从第 n 个参数开始移位;n 介于零和八之间。例如:

    SHIFT /2

会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。


把你一楼的代码放到WINDOWS的批处理中执行应该会得到一样的效果。

不过exit需要改成exit /b否则你就看不到结果了。

[ 本帖最后由 chenall 于 2011-12-5 16:24 编辑 ]
回复

使用道具 举报

11#
 楼主| 发表于 2011-12-5 16:33:12 | 只看该作者

回复 #10 chenall 的帖子

谢谢c大指点。
我还真不知道批处理竟然也有这两个命令
以前一直以为没有呢?
看来授人以渔的时候,也能被别人授鱼。。。。。。。

我要是不写这个东西估计c大很难有空把这个批处理给弄成教程。
回复

使用道具 举报

12#
发表于 2013-1-20 09:21:08 | 只看该作者
为什么,运行效果完全不一样? call 和goto 命令完全被忽略过去了
回复

使用道具 举报

13#
发表于 2013-1-20 11:19:09 | 只看该作者

回复 #12 2013xxcan 的帖子

你怎么看到被忽略了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-4-25 16:17

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表