[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[讨论]浅谈批处理中的%errorlevel%

#浅谈%errorlevel%#

对于%errorlevel%环境变量,大家想必是既熟悉又陌生吧。知道有这个东西的存在,但是不常用。
下面我将谈谈我对这个变量的见解,有错误请指正!

微软的Windows NT系列系统,主要是用C/C++语言写的,部分用汇编。(到了VISTA以后用的语言比较多,.NET框架占比重也比较大。)
它的命令行工具也差不多,大多是C/C++写的,部分是汇编写的(后缀是.com的文件)。

C/C++语言是写命令行工具的利器,一方面,它的语言效率高那是毫无疑问的,可以说仅次于汇编;另一方面,Windows系统提供了很多控制台程序的接口,C/C++语言可以方便的调用。

现在交代了下背景,其他废话就不多说了。
每个C/C++语言程序都有一个“主函数mian()”,下面我列举一个最简单的C/C++语言程序,后面那些是注释:
  1. #include<stdio.h>  //包含一个函数库,此句不用理解,略过
  2. int main()   //主函数,前面的 int 指这个函数有有整数的返回值
  3. {
  4.     int i;    //定义一个变量i,这个好理解
  5.     printf("请输入一个整数:")    //此句相当于批处理的 echo
  6.     scanf("%d",&i);  //用户输入 i 值,必须为数字
  7.     if(i==1)   //if语句大家都懂吧?
  8.     {
  9.            return 1;   // 前面我提到过了,main()是一个有返回值的函数
  10.                           //  这里的 return 就是返回语句,这句即为返回整数1
  11.     } else {
  12.            return 0;  //  返回整数0
  13.     }
  14. }
复制代码
代码写好了,找个工具编译,链接后,就可以得到我们的程序了,在CMD下运行,程序名为CPP.EXE:
  1. C:\Users\Broly\Desktop\VC>CPP.exe
  2. 请输入一个整数:0
  3. C:\Users\Broly\Desktop\VC>echo %errorlevel%
  4. 0
  5. C:\Users\Broly\Desktop\VC>CPP.exe
  6. 请输入一个整数:1
  7. C:\Users\Broly\Desktop\VC>echo %errorlevel%
  8. 1
  9. C:\Users\Broly\Desktop\VC>CPP.exe
  10. 请输入一个整数:2
  11. C:\Users\Broly\Desktop\VC>echo %errorlevel%
  12. 0
  13. C:\Users\Broly\Desktop\VC>CPP.exe
  14. 请输入一个整数:3
  15. C:\Users\Broly\Desktop\VC>echo %errorlevel%
  16. 0
  17. C:\Users\Broly\Desktop\VC>CPP.exe
  18. 请输入一个整数:4
  19. C:\Users\Broly\Desktop\VC>echo %errorlevel%
  20. 0
复制代码
大家发现什么没?没发现的,你再看看源代码中的 if 语句。
我的理解为:当一个程序运行完成后,main()函数的返回值会临时保存在 %errorlevel% 变量中。
这就是 %errorlevel% 为什么每个程序运行后都不一定相同的原因。
不过根据经验,一般C/C++语言程序,如果程序没有运行异常的话都会返回一个 0 值,即 return 0;否则将返回一个非零值。
%errorlevel% 具体取值还是要看写程序那个人如何取舍。
而且,不是每个程序都是C语言写的,也不是每个C语言程序都有返回值或者返回为整数。
我个人猜测,没有返回值的程序,%errorlevel% 的值将会是 0 。(由于时间关系我不想去实践,有兴趣的同学可以试试,最后把结果贴上来分享)
废话多了点,大家别见怪。
1

评分人数

---学无止境---

其实有一个API叫做ExitProcess。。。
所以errorlevel是神马呢,其 ...
defanive 发表于 2011-7-9 23:58

其实还有一个DOS中断叫做INT21 4CH...
就是用来指定errorlevel返回DOS的
这可以说是errorlevel之名的最早来源

另外只有微软系的OS才把程序退出所返回的错误码值称之为errorlevel
Unix系的OS一直是叫exit code或者return code的
天的白色影子

TOP

被牛人称为牛人的人——真牛。

TOP

12# defanive
牛人再现江湖。。。
***共同提高***

TOP

嗯,集思广义。有讨论才有进步。希望以后都能这样
---学无止境---

TOP

不是“可以有”,是一定有。
只不过有的程序不管结果如何都返回固定值。(比如初学C语言都是return 0;)

TOP

“我个人猜测,没有返回值的程序,%errorlevel% 的值将会是 0 。(由于时间关系我不想去实践,有兴趣的同学可以试试,最后把结果贴上来分享)”

其实有一个API叫做ExitProcess。。。
所以errorlevel是神马呢,其实就是进程退出的ExitCode。。。
所以是任何程序都可以有errorlevel的。。。
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

本帖最后由 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[]) { /* ... */ }

TOP

楼主:“我个人猜测,没有返回值的程序,%errorlevel% 的值将会是 0 ”

5楼的代码和解释已经否定了你的猜测。
你不要再越绕越远了(其实你的意思我明白)

TOP

8# powerbat

你用此格式造句:
如 int test();   test是返回值为int在函数

平时你怎么说void test();的?

这个是一个平常在叫法,void是无返回值


void main()的真实返回值是编译器给填上在。但我们平时怎么称呼这个函数的?请再看7L
---学无止境---

TOP

你为何不把我5楼代码中的void改为int再编译运行看看有没有区别呢?

TOP

5# powerbat


我说,你是不是我理解错了我的意思,还是我理解错了你的意思??
---学无止境---

TOP

5# powerbat


C++语法是那么说明的,你要是认为不对可以去找定义这套标准的人理论,跟我说没用。
---学无止境---

TOP

那只是你人为修改的,不符合标准。而这样修改并不影响程序装载器对主函数返回值的处理。
比如main()函数默认有两个参数(其实有三个),就算你不写,程序装载器照样传递。

编译下面这个程序,运行,看看%errorlevel%的值是多少。
void main()
{
    char arr[10];
    char *p = arr;
}

TOP

3# powerbat

void main()
无返回值
---学无止境---

TOP

返回列表