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

2025-05-15 15:14:19

Hello123World

发短消息

加为好友

Hello123World

当前离线

UID30829 帖子989 精华0 积分1566 PB1313 技术81 捐助0 阅读权限254 在线时间433 小时 注册时间2010-10-23 最后登录2025-4-21

荣誉版主

帖子989 积分1566 技术81 捐助0 注册时间2010-10-23

1楼

跳转到 »

倒序看帖

打印

字体大小: tT

发表于 2011-10-11 17:14

| 只看该作者

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

本帖最后由 Hello123World 于 2011-10-12 16:12 编辑

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

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

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

EXIT [/B] [exitCode]

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

批处理脚本外执行,则会退出 CMD.EXE

exitCode 指定一个数字号码。如果指定了 /B,将 ERRORLEVEL

设成那个数字。如果退出 CMD.EXE,则用那个数字设置

过程退出代码。复制代码命令概括:

exit,意为“退出”;

/b,全英文batch(不确定);

code,意为“代码”,exitcode就是“退出码”;

参数详解:

1.退出命令解释器;

脚本的运行都依赖解释器,批处理依赖cmd.exe,vbs依赖wscript.exe,没有解释器,脚本都不能运行。@echo off

echo hello

exit

echo world

pause复制代码exit 是退出解释器,造成world不显示,pause不执行。

2.退出当前批处理脚本;

乍一看,觉得和第一没什么区别,但事实上区别很大。

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

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

test.bat@echo off

echo 这是test.bat

echo 调用a.bat之前的状态

call a.bat

echo 调用a.bat之后的状态

echo %errorlevel%

pause复制代码a.bat@echo off

echo.

echo 这是a.BAT文件

echo.

exit /b复制代码现在把a.bat的内容替换成:@echo off

echo.

echo 这是a.BAT文件

echo.

exit /b 12复制代码再次运行test.bat

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

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

那么/b又有什么用呢?

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

继续将a.bat的内容替换:@echo off

echo.

echo 这是a.BAT文件

echo.

exit 复制代码再次运行test.bat

结果,黑框一闪而过,因为这三条语句都没有执行,echo 调用a.bat之后的状态

echo %errorlevel%

pause复制代码因此exit /b是用来退出批处理脚本的,而exit是用来退出解释器的;

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

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

exit /b 一般和call 一起使用。

扩展阅读:

无。

收藏

分享

如果用到sed命令,须下载sed.exe到c:\windows\system32文件夹中。

zaixinxiangnian

发短消息

加为好友

zaixinxiangnian

当前离线

UID22805 帖子144 精华0 积分153 PB144 技术3 捐助0 阅读权限20 在线时间72 小时 注册时间2010-3-24 最后登录2014-1-21

二级士官

帖子144 积分153 技术3 捐助0 注册时间2010-3-24

2楼

发表于 2011-10-11 20:04

| 只看该作者

回复 1# Hello123World 默认是0,/b 12之后就是12了。复制代码这句是不是多了个“12”啊

TOP

Hello123World

发短消息

加为好友

Hello123World

当前离线

UID30829 帖子989 精华0 积分1566 PB1313 技术81 捐助0 阅读权限254 在线时间433 小时 注册时间2010-10-23 最后登录2025-4-21

荣誉版主

帖子989 积分1566 技术81 捐助0 注册时间2010-10-23

3楼

发表于 2011-10-11 22:43

| 只看该作者

回复 2# zaixinxiangnian

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

如果用到sed命令,须下载sed.exe到c:\windows\system32文件夹中。

TOP

Fantasys

发短消息

加为好友

Fantasys

当前离线

UID42536 帖子18 精华0 积分19 PB19 技术0 捐助0 阅读权限5 在线时间4 小时 注册时间2011-10-11 最后登录2012-1-1

列兵

帖子18 积分19 技术0 捐助0 注册时间2011-10-11

4楼

发表于 2011-10-13 12:24

| 只看该作者

如果for语句里调用一个标签,我想让当次循环在调用标签后就不再运行后面的for语句,而运行下一循环,能不能做到?

而且,这个标签可能并不是第一个标签,即它后面还有标签。

TOP

Fantasys

发短消息

加为好友

Fantasys

当前离线

UID42536 帖子18 精华0 积分19 PB19 技术0 捐助0 阅读权限5 在线时间4 小时 注册时间2011-10-11 最后登录2012-1-1

列兵

帖子18 积分19 技术0 捐助0 注册时间2011-10-11

5楼

发表于 2011-10-13 12:29

| 只看该作者

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

TOP

Hello123World

发短消息

加为好友

Hello123World

当前离线

UID30829 帖子989 精华0 积分1566 PB1313 技术81 捐助0 阅读权限254 在线时间433 小时 注册时间2010-10-23 最后登录2025-4-21

荣誉版主

帖子989 积分1566 技术81 捐助0 注册时间2010-10-23

6楼

发表于 2011-10-13 13:14

| 只看该作者

回复 4# Fantasys

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

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

如果用到sed命令,须下载sed.exe到c:\windows\system32文件夹中。

TOP

ai20110304

发短消息

加为好友

ai20110304

当前离线

UID73207 帖子112 精华0 积分124 PB124 技术0 捐助0 阅读权限20 在线时间261 小时 注册时间2015-10-10 最后登录2024-11-20

一级士官

帖子112 积分124 技术0 捐助0 注册时间2015-10-10

7楼

发表于 2018-8-29 22:52

| 只看该作者

回复 6# Hello123World

这个解释很到位

我就是我,不一样的烟火!

TOP

《燕雲十六聲》拍照照片保存位置介紹
阿鲁的觉醒,铃木大R迎来重大换代