无忧启动论坛

标题: grub4dos关键字goto|call|exit1的用法! [打印本页]

作者: hotdll    时间: 2011-12-5 10:24
标题: grub4dos关键字goto|call|exit1的用法!
大部分都是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 编辑 ]
作者: hotdll    时间: 2011-12-5 10:25
二、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 编辑 ]
作者: my9823    时间: 2011-12-5 14:03
有点像调用子程序,而子程序执行完返回继续,为什么调用时只执行1条?
作者: pseudo    时间: 2011-12-5 14:20
一眼没看出#1楼两个图有什么不对劲。
作者: zxw    时间: 2011-12-5 14:40
图倒是有区别。代码是一样的。<br />估计是复制前面的忘了改。

[ 本帖最后由 zxw 于 2011-12-5 14:43 编辑 ]
作者: chenall    时间: 2011-12-5 14:43
第一个是call :2
第二个是call :1
我看着好像很正常啊。
作者: hotdll    时间: 2011-12-5 14:49
标题: 回复 #6 chenall 的帖子
还是c大眼尖。。。。

呵呵区别就是这个地方。

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

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

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

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

[ 本帖最后由 hotdll 于 2011-12-5 15:00 编辑 ]
作者: chenall    时间: 2011-12-5 15:30
汗。这个和WINDOWS批处理的机制是一样的。。

熟悉WINDOWS批处理的人自然明白。
作者: hotdll    时间: 2011-12-5 16:18
原帖由 chenall 于 2011-12-5 15:30 发表
汗。这个和WINDOWS批处理的机制是一样的。。

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



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

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

[ 本帖最后由 hotdll 于 2011-12-5 16:20 编辑 ]
作者: chenall    时间: 2011-12-5 16:22
标题: 回复 #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 编辑 ]
作者: hotdll    时间: 2011-12-5 16:33
标题: 回复 #10 chenall 的帖子
谢谢c大指点。
我还真不知道批处理竟然也有这两个命令
以前一直以为没有呢?
看来授人以渔的时候,也能被别人授鱼。。。。。。。

我要是不写这个东西估计c大很难有空把这个批处理给弄成教程。
作者: 2013xxcan    时间: 2013-1-20 09:21
为什么,运行效果完全不一样? call 和goto 命令完全被忽略过去了
作者: sratlf    时间: 2013-1-20 11:19
标题: 回复 #12 2013xxcan 的帖子
你怎么看到被忽略了




欢迎光临 无忧启动论坛 (http://wuyou.net./) Powered by Discuz! X3.3