标题: [讨论]浅谈批处理中的%errorlevel% [打印本页]
作者: broly 时间: 2011-7-9 20:38 标题: [讨论]浅谈批处理中的%errorlevel%
#浅谈%errorlevel%#
对于%errorlevel%环境变量,大家想必是既熟悉又陌生吧。知道有这个东西的存在,但是不常用。
下面我将谈谈我对这个变量的见解,有错误请指正!
微软的Windows NT系列系统,主要是用C/C++语言写的,部分用汇编。(到了VISTA以后用的语言比较多,.NET框架占比重也比较大。)
它的命令行工具也差不多,大多是C/C++写的,部分是汇编写的(后缀是.com的文件)。
C/C++语言是写命令行工具的利器,一方面,它的语言效率高那是毫无疑问的,可以说仅次于汇编;另一方面,Windows系统提供了很多控制台程序的接口,C/C++语言可以方便的调用。
现在交代了下背景,其他废话就不多说了。
每个C/C++语言程序都有一个“主函数mian()”,下面我列举一个最简单的C/C++语言程序,后面那些是注释:- #include<stdio.h> //包含一个函数库,此句不用理解,略过
- int main() //主函数,前面的 int 指这个函数有有整数的返回值
- {
- int i; //定义一个变量i,这个好理解
- printf("请输入一个整数:") //此句相当于批处理的 echo
- scanf("%d",&i); //用户输入 i 值,必须为数字
- if(i==1) //if语句大家都懂吧?
- {
- return 1; // 前面我提到过了,main()是一个有返回值的函数
- // 这里的 return 就是返回语句,这句即为返回整数1
- } else {
- return 0; // 返回整数0
- }
- }
复制代码
代码写好了,找个工具编译,链接后,就可以得到我们的程序了,在CMD下运行,程序名为CPP.EXE:- C:\Users\Broly\Desktop\VC>CPP.exe
- 请输入一个整数:0
- C:\Users\Broly\Desktop\VC>echo %errorlevel%
- 0
- C:\Users\Broly\Desktop\VC>CPP.exe
- 请输入一个整数:1
- C:\Users\Broly\Desktop\VC>echo %errorlevel%
- 1
- C:\Users\Broly\Desktop\VC>CPP.exe
- 请输入一个整数:2
- C:\Users\Broly\Desktop\VC>echo %errorlevel%
- 0
- C:\Users\Broly\Desktop\VC>CPP.exe
- 请输入一个整数:3
- C:\Users\Broly\Desktop\VC>echo %errorlevel%
- 0
- C:\Users\Broly\Desktop\VC>CPP.exe
- 请输入一个整数:4
- C:\Users\Broly\Desktop\VC>echo %errorlevel%
- 0
复制代码
大家发现什么没?没发现的,你再看看源代码中的 if 语句。
我的理解为:当一个程序运行完成后,main()函数的返回值会临时保存在 %errorlevel% 变量中。
这就是 %errorlevel% 为什么每个程序运行后都不一定相同的原因。
不过根据经验,一般C/C++语言程序,如果程序没有运行异常的话都会返回一个 0 值,即 return 0;否则将返回一个非零值。
%errorlevel% 具体取值还是要看写程序那个人如何取舍。
而且,不是每个程序都是C语言写的,也不是每个C语言程序都有返回值或者返回为整数。
我个人猜测,没有返回值的程序,%errorlevel% 的值将会是 0 。(由于时间关系我不想去实践,有兴趣的同学可以试试,最后把结果贴上来分享)
废话多了点,大家别见怪。
作者: Batcher 时间: 2011-7-9 20:49
批处理各命令错误返回值errorlevel一览
http://bbs.bathome.net/thread-3603-1-1.html
批处理内部命令对错误返回码errorlevel的影响
http://bbs.bathome.net/thread-7479-1-1.html
希望对大家的学习有帮助
作者: powerbat 时间: 2011-7-9 20:58
根据标准主函数必须有返回值(不管什么语言)。
函数应该有返回值但没有return语句的,返回值将不确定。(一般为函数结束时eax寄存器的值)
作者: broly 时间: 2011-7-9 21:05
3# powerbat
void main()
无返回值
作者: powerbat 时间: 2011-7-9 21:23
那只是你人为修改的,不符合标准。而这样修改并不影响程序装载器对主函数返回值的处理。
比如main()函数默认有两个参数(其实有三个),就算你不写,程序装载器照样传递。
编译下面这个程序,运行,看看%errorlevel%的值是多少。
void main()
{
char arr[10];
char *p = arr;
}
作者: broly 时间: 2011-7-9 21:41
5# powerbat
C++语法是那么说明的,你要是认为不对可以去找定义这套标准的人理论,跟我说没用。
作者: broly 时间: 2011-7-9 21:54
5# powerbat
我说,你是不是我理解错了我的意思,还是我理解错了你的意思??
作者: powerbat 时间: 2011-7-9 22:14
你为何不把我5楼代码中的void改为int再编译运行看看有没有区别呢?
作者: broly 时间: 2011-7-9 22:19
8# powerbat
你用此格式造句:
如 int test(); test是返回值为int在函数
平时你怎么说void test();的?
这个是一个平常在叫法,void是无返回值
void main()的真实返回值是编译器给填上在。但我们平时怎么称呼这个函数的?请再看7L
作者: powerbat 时间: 2011-7-9 22:26
楼主:“我个人猜测,没有返回值的程序,%errorlevel% 的值将会是 0 ”
5楼的代码和解释已经否定了你的猜测。
你不要再越绕越远了(其实你的意思我明白)
作者: Demon 时间: 2011-7-9 23:25
本帖最后由 Demon 于 2011-7-9 23:30 编辑
5# powerbat
C++语法是那么说明的,你要是认为不对可以去找定义这套标准的人理论,跟我说没用。
broly 发表于 2011-7-9 21:41
C++标准里根本没有void main()这种写法
这是C++的发明者Bjarne Stroustrup关于void main()的回答
http://www2.research.att.com/~bs/bs_faq2.html#void-main
The definition
void main() { /* ... */ }
is not and never has been C++, nor has it even been C. See the ISO C++ standard 3.6.1[2] or the ISO C standard 5.1.2.2.1. A conforming implementation accepts
int main() { /* ... */ }
and
int main(int argc, char* argv[]) { /* ... */ }
作者: defanive 时间: 2011-7-9 23:58
“我个人猜测,没有返回值的程序,%errorlevel% 的值将会是 0 。(由于时间关系我不想去实践,有兴趣的同学可以试试,最后把结果贴上来分享)”
其实有一个API叫做ExitProcess。。。
所以errorlevel是神马呢,其实就是进程退出的ExitCode。。。
所以是任何程序都可以有errorlevel的。。。
作者: powerbat 时间: 2011-7-10 00:13
不是“可以有”,是一定有。
只不过有的程序不管结果如何都返回固定值。(比如初学C语言都是return 0;)
作者: broly 时间: 2011-7-10 01:03
嗯,集思广义。有讨论才有进步。希望以后都能这样
作者: batman 时间: 2011-7-10 02:11
12# defanive
牛人再现江湖。。。
作者: Hello123World 时间: 2011-7-10 14:05
被牛人称为牛人的人——真牛。
作者: qzwqzw 时间: 2011-7-11 09:45
其实有一个API叫做ExitProcess。。。
所以errorlevel是神马呢,其 ...
defanive 发表于 2011-7-9 23:58
其实还有一个DOS中断叫做INT21 4CH...
就是用来指定errorlevel返回DOS的
这可以说是errorlevel之名的最早来源
另外只有微软系的OS才把程序退出所返回的错误码值称之为errorlevel
Unix系的OS一直是叫exit code或者return code的
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |