批处理之家's Archiver

Hello123World 发表于 2011-10-11 17:14

【续】[一日一教学](27)退出CMD窗口:exit

[i=s] 本帖最后由 Hello123World 于 2011-10-12 16:12 编辑 [/i]

【原】[一日一教学]批处理系列帖子索引 [url]http://bbs.bathome.net/thread-2576-1-1.html[/url]
【续】[一日一教学]批处理系列帖子索引 [url]http://bbs.bathome.net/thread-13798-1-1.html[/url]


帮助信息:[code]退出 CMD.EXE 程序(命令解释器)或当前批处理脚本。

EXIT [/B] [exitCode]

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

  exitCode    指定一个数字号码。如果指定了 /B,将 ERRORLEVEL
              设成那个数字。如果退出 CMD.EXE,则用那个数字设置
              过程退出代码。[/code]命令概括:
exit,意为“退出”;
/b,全英文batch(不确定);
code,意为“代码”,exitcode就是“退出码”;


参数详解:
1.退出命令解释器;
脚本的运行都依赖解释器,批处理依赖cmd.exe,vbs依赖wscript.exe,没有解释器,脚本都不能运行。[code]@echo off
echo hello
exit
echo world
pause[/code]exit 是退出解释器,造成world不显示,pause不执行。

2.退出当前批处理脚本;
乍一看,觉得和第一没什么区别,但事实上区别很大。

试着运行下面的代码,比较其中差别:

保存两个批处理,分别命名test、a;运行test.bat;

test.bat[code]@echo off
echo 这是test.bat
echo 调用a.bat之前的状态
call a.bat
echo 调用a.bat之后的状态
echo %errorlevel%
pause[/code]a.bat[code]@echo off
echo.
echo 这是a.BAT文件
echo.
exit /b
[/code]现在把a.bat的内容替换成:[code]@echo off
echo.
echo 这是a.BAT文件
echo.
exit /b 12
[/code]再次运行test.bat

如果你细心的话,就会发现errorlevel的值变了,默认是0,/b 12之后就是12了。

[quote]没错,EXIT [/B] [exitCode]中[exitCode]就是用来设置,退出码errorlevel的值。[/quote]

那么/b又有什么用呢?

正如那句话所说,[quote]要知道一件事物的重要性,那就看看没有这件事物时世界会是怎样。[/quote]

继续将a.bat的内容替换:[code]@echo off
echo.
echo 这是a.BAT文件
echo.
exit
[/code]再次运行test.bat

结果,黑框一闪而过,因为这三条语句都没有执行,[code]echo 调用a.bat之后的状态
echo %errorlevel%
pause[/code]因此exit /b是用来退出批处理脚本的,而exit是用来退出解释器的;

可以这么理解,exit /b 退出子进程,而exit则退出父进程,子进程结束不影响父进程的执行,但是父进程结束那就是彻底的结束。

(当然,如果只有一个进程,exit /b也是能结束父进程的)。

[quote]exit /b 一般和call 一起使用。[/quote]



扩展阅读:
无。

zaixinxiangnian 发表于 2011-10-11 20:04

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=94236&ptid=14329]1#[/url] [i]Hello123World[/i] [/b][code]默认是0,/b 12之后就是12了。
[/code]这句是不是多了个“12”啊

Hello123World 发表于 2011-10-11 22:43

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=94246&ptid=14329]2#[/url] [i]zaixinxiangnian[/i] [/b]


    我是故意这么写的,/b 6之后就是6了,为了强调数字。

Fantasys 发表于 2011-10-13 12:24

如果for语句里调用一个标签,我想让当次循环在调用标签后就不再运行后面的for语句,而运行下一循环,能不能做到?
而且,这个标签可能并不是第一个标签,即它后面还有标签。

Fantasys 发表于 2011-10-13 12:29

还有,有没有办法根据这个exitcode来判断调用程序里的语句有没有顺利执行?

Hello123World 发表于 2011-10-13 13:14

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=94401&ptid=14329]4#[/url] [i]Fantasys[/i] [/b]

exit /b 和call一起用,call调用的不是标签(虽然可以调用标签),而是另一个bat。

标签不会生成新的cmd进程,exit /b没有用武之地。

ai20110304 发表于 2018-8-29 22:52

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=94406&ptid=14329]6#[/url] [i]Hello123World[/i] [/b]


    这个解释很到位

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.