![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-13 22:11 |
共 47,812 主题排行 / 349,916 发帖 / 今日 0 篇 / 48,268 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » [分享]如何获取DOS环境中的ERRORLEVEL值 |
| 可打印版本 2,887 / 10 |
| 第1楼 willsort | 发表于 2004-02-03 00:00 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
[分享]如何获取DOS环境中的ERRORLEVEL值 To All:
以下批处理程序是关于获取DOS环境中由外部程序退出时产生的ERRORLEVEL值的若干算法。因为系统因素均未经测试,请有心者代劳,敬谢指正! 关于如何设置 ERRORLEVEL 值的程序,见: http://model.chinajewelry.net/dos/dosbbs/dispbbs.asp?boardID=6&ID=9444 |
|
| 第2楼 willsort | 发表于 2004-02-03 00:00 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
::geterror.bat - First version
::最中规中距,最美观大方的算法,也是最冗长繁复,最效率低下的算法 ::我曾经在一个脚本增强工具包里见过,慨叹批处理程序也有这样的算法 ::我是没耐心将它写全了相信各位明白我的意思了 @echo off if errorlevel 0 if not errorlevel 1 set el=1 if errorlevel 1 if not errorlevel 2 set el=2 ........... if errorlevel 255 if not errorlevel 256 set el=255 ::最后一句中的IF NOT ERRORLEVEL 256其实不必要,不过要讲究形式美嘛 ![]() |
|
| 第3楼 willsort | 发表于 2004-02-03 00:00 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
::geterror.bat - Second version
::一种五十步笑百步的改进版 ::减少了一些IF NOT ERRORLEVEL 却增加了SET EL= ::曾经在帖子上有人这样贴过,倒是节约了些字节 ::还是没写全,请众位有心的补齐吧 ![]() @echo off if errorlevel 0 set el=0 ::上句中的if errorlevel 0 其实也用不着,之所以要写原因同上 if errorlevel 1 set el=1 if errorlevel 2 set el=2 ...... if errorlevel 255 set el=255 |
|
| 第4楼 willsort | 发表于 2004-02-03 00:00 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
::geterror.bat - Third version
::一个效率上有明显改进的算法,我自己最初的改进版 ::利用了简单的数学原理,使经常获得的低errorlevel值有较好的执行时间 ::可惜写起来还是太累,而且对于高errorlevel值效率还是太低 @echo off if not errorlevel 1 goto two0 if not errorlevel 2 goto two1 if not errorlevel 4 goto two2 if not errorlevel 8 goto two3 if not errorlevel 16 goto two4 if not errorlevel 32 goto two5 if not errorlevel 64 goto two6 if not errorlevel 128 goto two7 if not errorlevel 256 goto two8 :two0 set el=0 goto end :two1 set el=1 goto end :two2 if errorlevel 2 set el=2 if errorlevel 3 set el=3 goto end :two3 if errorlevel 4 set el=4 if errorlevel 5 set el=5 ... goto end :two4 ... ...... if errorlevel 255 set el=255 goto end :end |
|
| 第5楼 willsort | 发表于 2004-02-03 00:00 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
=============
本文因重发问题被作者删除 ============= |
|
| 第6楼 willsort | 发表于 2004-02-03 00:00 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
::geterror.bat - Forth version
::这是一个兼顾容量和效率的算法 ::然而仍然存在高ERRORLEVEL值的慢获取,尤其不断地生成和销毁DOS壳更耗时间 @echo off set el=0 if not errorlevel 1 goto end if not errorlevel 10 goto ten0 if not errorlevel 100 goto ten1 goto ten2 :ten0 for %%n in (1 2 3 4 5 6 7 8 9) do if errorlevel %%n set el=%%n goto end :ten1 for %%n in (1 2 3 4 5 6 7 8 9) do %comspec% /c for %%m in (1 2 3 4 5 6 7 8 9) do if errorlevel %%n%%m set el=%%n%%m goto end :ten2 for %%n in (1 2 3 4 5 6 7 8 9) do %comspec% /c for %%m in (1 2 3 4 5 6 7 8 9) do if errorlevel 1%%n%%m set el=1%%n%%m for %%n in (1 2 3 4 5) do %comspec% /c for %%m in (1 2 3 4 5 6 7 8 9) do if errorlevel 2%%n%%m set el=2%%n%%m goto end :end |
|
| 第7楼 Wengier | 发表于 2004-02-03 00:00 |
| 系统支持 发帖 10,521 积分 27,736 | |
|
自己编写批处理得到ERRORLEVEL值的方法我已经也曾做过,不过太复杂、麻烦。还是用COMMAND/Z或ERR2ENV等工具比较简便易行吧。
|
|
| 第8楼 willsort | 发表于 2004-02-04 00:00 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
::geterror.bat - Fifth version
::根据Roy发的同类程序修改而成,链接如下: ::http://model.chinajewelry.net/dos/dosbbs/dispbbs.asp?BoardID=12&ID=9348&replyID=56640&skin=1 ::这是一个改进很大的算法,算法思想上由分区检测改为分位检测 ::嵌套循环改为并列循环,时间代价下降了一个数量级 ::壳的生成与销毁也被避免,即使对高ERRORLEVEL值的获取,也有了不错的性能 ::篇幅也进一步缩减,这基本上已经是循环算法的最优算法了。 @echo off set el=0 if errorlevel 1 set el=1 if not errorlevel 2 goto end :partbydec for %%h in (1 2) do if errorlevel %%h00 set elh=%%h if errorlevel 10 for %%t in (0 1 2 3 4 5 6 7 8 9) do if errorlevel %elh%%%t0 set elt=%elh%%%t for %%o in (0 1 2 3 4 5 6 7 8 9) do if errorlevel %elt%%%o set el=%elt%%%o set elh= set elt= :end if not == echo Current errorlevel is %el% ::未完待续 |
|
| 第9楼 Kinglion | 发表于 2004-02-05 00:00 |
| 铂金会员 发帖 1,924 积分 5,798 来自 金獅電腦軟體工作室 | |
|
我的批处理文件:
@echo off for %%a in (0;1;2;3;4;5;6;7;8;9 do if errorlevel %%a set testerr=%%afor %%a in (10;11;12;13;14;15;16;17;18;19 do if errorlevel %%a set testerr=%%afor %%a in (20;21;22;23;24;25;26;27;28;29 do if errorlevel %%a set testerr=%%afor %%a in (30;31;32;33;34;35;36;37;38;39 do if errorlevel %%a set testerr=%%afor %%a in (40;41;42;43;44;45;46;47;48;49 do if errorlevel %%a set testerr=%%a. . . for %%a in (250;251;252;253;254;255) do if errorlevel %%a set testerr=%%a echo. echo Current errorlevel is : %testerr% echo. set testerr= |
|
| 第10楼 willsort | 发表于 2004-02-06 00:00 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
::geterror.bat - Sixth version
::所以说测试很重要,刚刚发现在fifth版中存在一个严重的bug: ::凡是大于等于200以上的errorlevel都会被测为299,这是修正后的版本 ::请Kinglion兄和其他兄弟在测试一次吧 @echo off set el=0 if errorlevel 1 set el=1 if not errorlevel 2 goto end :partbydec for %%h in (1 2) do if errorlevel %%h00 set elh=%%h if errorlevel 10 if not == for %%t in (0 1 2 3 4 5 6 7 8 9) do if errorlevel %elh%%%t0 set elt=%elh%%%t if == for %%t in (0 1 2 3 4 5) do if errorlevel %elh%%%t0 set elt=%elh%%%t if not == for %%o in (0 1 2 3 4 5 6 7 8 9) do if errorlevel %elt%%%o set el=%elt%%%o if == for %%o in (0 1 2 3 4 5) do if errorlevel %elt%%%o set el=%elt%%%o set elh= set elt= :end if not == echo Current errorlevel is %el% |
|
| 第11楼 willsort | 发表于 2005-04-16 00:00 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
下面是第七版程序,它包含了设置Errorlvel的代码,起因于此http://www.51ct.net/bbs/read.php?tid=4181&fpage=1
:: ErrLvl.bat - Reset/set and Display/get errorlevel (设置和获取错误返回码) |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |