中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » [分享]如何设置DOS环境中的ERRORLEVEL值
作者:
标题: [分享]如何设置DOS环境中的ERRORLEVEL值 上一主题 | 下一主题
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『楼 主』:  [分享]如何设置DOS环境中的ERRORLEVEL值

To All:

    DOS环境中的ERRORLEVEL值一般由外部程序退出时产生,但在某种情况下我们需要自己产生errorlevel值。

    以下批处理程序就是关于设置ERRORLEVEL的若干方法,因为系统因素均未经测试,请有心者代劳,敬谢指正!

    另外,获取errorlevel值的程序可见:
    http://model.chinajewelry.net/dos/dosbbs/dispbbs.asp?boardID=6&ID=9358





※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-2-6 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 2 楼』:  

:: Seterror.bat - First version
:: 这是我的第一个算法,用单纯批处理实现,有很多限制
:: 只能设置0-9和255,其它值均作为“大值”被设置为10
@echo off
if [%1]==[] goto end
if [%1]==[0] goto setzero
if [%1]==[255] goto setmax
for %%a in (1 2 3 4 5 6 7 8 9) do if [%1]==[%%a] goto set1to9
goto setbig

:setzero
echo exist> test.txt
find "exist" test.txt > nul
del test.txt
goto end

:set1to9
choice /c:123456789 /t:%1,1 /n > nul
goto end

:setbig
choice /c:123456789a /t:a,1 /n > nul
goto end

:setmax
choice /d /n > nul
goto end

:end




[此贴子已经被作者于2004-2-7 19:32:37编辑过]






※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-2-6 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 3 楼』:  

::Seterror.bat - Second version
::以下是一个汇编算法,调用了dos提供的int21中断4c子功能
::使用时第一参数必须是两位16进制数
@echo off
if [%1]==[] goto end

:main
echo a>seterror.asd
echo mov ax,4c%1>>seterror.asd
echo int21>>seterror.asd
echo.>>seterror.asd
echo g>>seterror.asd
echo q>>seterror.asd
debug  nul

:check
call geterror.bat @
if [%el%]==[0] if not [%1]==[00] goto error
if not [%2]==[@] echo Set current errorlevel is %el%
goto end

:error
echo.
echo Error: Invalid argument "%1"
echo.
goto end

:end




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-2-6 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 4 楼』:  

:: Seterror.bat - Third version
:: 这是汇编程序的改进版,加入了进制转换代码,可以使用十进制参数了
:: 对于非法的参数处理:
:: 22e-->22   e22-->0  256-->0  65535-->255  65536-->0
@echo off
if [%1]==[] goto end
if exist seterror.com goto run
if exist seterror.asd goto debug

:setscript
echo >seterror.asd A100
echo>>seterror.asd MOV     SI,0082
echo>>seterror.asd XOR     AX,AX
echo>>seterror.asd XOR     BX,BX
echo>>seterror.asd MOV     CX,000A
echo>>seterror.asd MOV     BL,[SI]
echo>>seterror.asd CMP     BL,30
echo>>seterror.asd JL      0120
echo>>seterror.asd CMP     BL,39
echo>>seterror.asd JG      0120
echo>>seterror.asd SUB     BL,30
echo>>seterror.asd MUL     CX
echo>>seterror.asd ADD     AX,BX
echo>>seterror.asd INC     SI
echo>>seterror.asd JMP     010A
echo>>seterror.asd MOV     AH,4C
echo>>seterror.asd INT     21
echo.>>seterror.asd
echo>>seterror.asd R CX
echo>>seterror.asd 24
echo>>seterror.asd W
echo>>seterror.asd Q

:debug
debug SETERROR.COM  nul

:run
seterror.com %1
if not errorlevel %1 goto error
if not [%2]==[@] if errorlevel %1 echo Current errorlevel is set.
if exist geterror.bat call geterror.bat %3
::if exist seterror.com del seterror.com
::if exist seterror.asd del seterror.asd
goto end

:error
echo.
echo Error: Fail to set current errorlevel.
echo.
goto end

:end



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-2-7 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 5 楼』:  


    这是 Horst Schaeffer 的汇编版本,同样支持十进制数参数,不过比我自己编得更条理一些,而且加上了命令行提示。使用时可以将以下文本保存入 el!.txt 文件中,然后在 dos 命令行输入 “debug < el!.txt” 即可得到 el!.com 文件。运行时用法为 “el! 想设置的 errorlevel 值”。

  Quote:
A 100
MOV     SI,0081  ;定位字符串源址为命令行
LODSB            ;载入[si]处一个字符到寄存器al中
CMP     AL,20    ;将之与空格相比较
JZ      0103     ;等于空格则跳向 lodsb, 载入下一字符
DEC     SI       ;否则 si 减一, 字符串指针指向第一参数
CMP     AL,30    ;将载入的 al 值与字符 '0' 相比较
JB      0128     ;若小于 '0' 则跳向 mov dx,0133 处显示帮助
SUB     AX,AX    ;ax 置零
SUB     BH,BH    ;bx 置零
MOV     DX,000A  ;dx 置 10           (保存进制值)
MOV     BL,[SI]  ;取 [si] 处的字符到 bl 中
INC     SI       ;字符串指针 si 加一
SUB     BL,30    ;减去 '0'           (将 bl 的值有字符数转换为二进制数)
CMP     BL,DL    ;比较 bl 与 dl 的值 (测试 bl 是否是非法字符≥10)
JNB     0124     ;bl ≥ 10 则跳向 mov ah,4c    (置 errorlevel)
MUL     DX       ;将原数 ax 乘以 10 (dx)
ADD     AX,BX    ;将原数 ax 加上 新数 bx
JNB     0111     ;cf=0 (??) 则跳回 mov dx, 000a (转换下一个字符)
MOV     AH,4C    ;置 errorlevel 退出
INT     21
MOV     DX,0133  ;定位 [0133] 处的帮助字符串
MOV     AH,09    ;显示 [dx] 处的字符串
INT     21
SUB     AL,AL    ;al 置零
JMP     0124     ;跳回mov dx,0133处显示帮助
DB      'EL! n' 0d 0a 'sets errorlevel to n=0..255' 0d 0a 24

r cx
58
n el!.com
w
q





※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-3-2 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: