中国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 的值? 上一主题 | 下一主题
stevenldj
初级用户





积分 36
发帖 15
注册 2005-11-26
状态 离线
『楼 主』:  怎样在纯 DOS 下随时查看 ERRORLEVEL 的值?


我想写一个批处理,用于在纯 DOS 下查看当前 ERRORLEVEL 的值,可是总不成功。

ECHO %ERRORLEVEL%

这个总显示 ECHO IS ON

还有一个办法,就是启动 COMMAND.EXE /Z ,可以实时查看 ERRORLEVEL 的值。这个办法不怎么好,能不能有什么办法,在需要的时候就可以直接查看的?

我写了下面的一个批处理,也不行,有时候它会把所有值都列出来。

------------------------------------------------------------
@Echo Off
For %%i in (5 4 3 2 1 0) do if ErrorLevel 25%%i Echo ErrorLevel: 25%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 24%%i Echo ErrorLevel: 24%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 23%%i Echo ErrorLevel: 23%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 22%%i Echo ErrorLevel: 22%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 21%%i Echo ErrorLevel: 21%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 20%%i Echo ErrorLevel: 20%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 19%%i Echo ErrorLevel: 19%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 18%%i Echo ErrorLevel: 18%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 17%%i Echo ErrorLevel: 17%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 16%%i Echo ErrorLevel: 16%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 15%%i Echo ErrorLevel: 15%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 14%%i Echo ErrorLevel: 14%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 13%%i Echo ErrorLevel: 13%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 12%%i Echo ErrorLevel: 12%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 11%%i Echo ErrorLevel: 11%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 10%%i Echo ErrorLevel: 10%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 9%%i Echo ErrorLevel: 9%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 8%%i Echo ErrorLevel: 8%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 7%%i Echo ErrorLevel: 7%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 6%%i Echo ErrorLevel: 6%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 5%%i Echo ErrorLevel: 5%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 4%%i Echo ErrorLevel: 4%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 3%%i Echo ErrorLevel: 3%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 2%%i Echo ErrorLevel: 2%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel 1%%i Echo ErrorLevel: 1%%i
For %%i in (9 8 7 6 5 4 3 2 1 0) do if ErrorLevel %%i Echo ErrorLevel: %%i

------------------------------------------------------------



2008-8-20 23:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 2 楼』:  

参考链接:http://www.robvanderwoude.com/errorlevel.html
@ECHO OFF
REM Reset variables
FOR %%A IN (1 10 100) DO SET ERR%%A=

REM Check error level hundredfolds
FOR %%A IN (0 1 2) DO IF ERRORLEVEL %%A00 SET ERR100=%%A
IF %ERR100%==2 GOTO 200
IF %ERR100%==0 IF NOT "%1"=="/0" SET ERR100=

REM Check error level tenfolds
FOR %%A IN (0 1 2 3 4 5 6 7 8 9) DO IF ERRORLEVEL %ERR100%%%A0 SET ERR10=%%A
IF "%ERR100%"=="" IF %ERR10%==0 SET ERR10=

:1
REM Check error level units
FOR %%A IN (0 1 2 3 4 5) DO IF ERRORLEVEL %ERR100%%ERR10%%%A SET ERR1=%%A
REM Modification necessary for errorlevels 250+
IF NOT ERRORLEVEL 250 FOR %%A IN (6 7 8 9) DO IF ERRORLEVEL %ERR100%%ERR10%%%A SET ERR1=%%A
GOTO End

:200
REM In case of error levels over 200 both
REM tenfolds and units are limited to 5
REM since the highest DOS error level is 255
FOR %%A IN (0 1 2 3 4 5) DO IF ERRORLEVEL 2%%A0 SET ERR10=%%A
IF ERR10==5 FOR %%A IN (0 1 2 3 4 5) DO IF ERRORLEVEL 25%%A SET ERR1=%%A
IF NOT ERR10==5 GOTO 1

:End
REM Clean up the mess and show results
SET ERRORLEV=%ERR100%%ERR10%%ERR1%
FOR %%A IN (1 10 100) DO SET ERR%%A=
ECHO ERRORLEVEL  %ERRORLEV%




偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2008-8-21 03:09
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
stevenldj
初级用户





积分 36
发帖 15
注册 2005-11-26
状态 离线
『第 3 楼』:  


谢谢,代码很精彩,我简化了一下,不知道有没有什么缺陷,请看一下:

------------------------------------------------------------

@ECHO OFF

:: 复位变量
FOR %%A IN (1 10 100) DO SET ERR%%A=

:: 检查 ERRORLEVEL 的百位值
FOR %%A IN (0 1 2) DO IF ERRORLEVEL %%A00 SET ERR100=%%A
:: 是否显示 0 前导符
IF %ERR100%==0 IF NOT "%1"=="/0" SET ERR100=

:: 检查 ERRORLEVEL 的十位值
FOR %%A IN (0 1 2 3 4 5 6 7 8 9) DO IF ERRORLEVEL %ERR100%%%A0 SET ERR10=%%A
:: 是否显示 0 前导符
IF "%ERR100%"=="" IF %ERR10%==0 SET ERR10=

:: 检查 ERRORLEVEL 的个位值
FOR %%A IN (0 1 2 3 4 5 6 7 8 9) DO IF ERRORLEVEL %ERR100%%ERR10%%%A SET ERR1=%%A

:: 设置结果
SET ERRORLEV=%ERR100%%ERR10%%ERR1%
:: 限制 ERRORLEV 最大为 255
IF ERRORLEVEL 255 SET ERRORLEV=255
:: 清理临时变量
FOR %%A IN (1 10 100) DO SET ERR%%A=
:: 显示结果
ECHO ERRORLEVEL  %ERRORLEV%

------------------------------------------------------------



[ Last edited by stevenldj on 2008-8-21 at 09:46 AM ]

2008-8-21 09:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
stevenldj
初级用户





积分 36
发帖 15
注册 2005-11-26
状态 离线
『第 4 楼』:  

`

还有个问题不懂,就是 上面代码中

IF NOT "%1"=="/0"

能不能写成

IF NOT %1#==/0#

IF NOT %1==/0

我觉得这句不加引号或 # 号也可以,不知道判断语句中等号两边的字符有没有什么要求

最后觉得还是加引号好一些,在代码着色的编辑器中看着清晰一些



`

[ Last edited by stevenldj on 2008-8-21 at 10:35 AM ]

2008-8-21 09:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 5 楼』:  

楼上的,你精简的有问题,最好按照人家的原样运行。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2008-8-21 09:52
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
stevenldj
初级用户





积分 36
发帖 15
注册 2005-11-26
状态 离线
『第 6 楼』:  

我在 DOS 下用 DREADY 测试过了,可以正确显示 ERRORLEVEL 的值,包括 255,不知道问题在哪里,请指明,谢谢

2008-8-21 10:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 7 楼』:  

你精简后,组合中会出现超过255的值,这有可能造成问题。原批处理是充分考虑到这些特殊情况的。另外,我发现这个批处理无法运行在XP环境下,因为XP的for命令会设置errorlevel值为1。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2008-8-21 11:10
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
stevenldj
初级用户





积分 36
发帖 15
注册 2005-11-26
状态 离线
『第 8 楼』:  

`
组合中超过 255 的值在最后

IF ERRORLEVEL 255 SET ERRORLEV=255

这个地方都被转换成 255 了啊,最后结果中是不会有超过 255 的值存在的。

转换结果正确就可以了,转换过程中出现的超过 255 的值有什么影响吗?

你说的“有可能造成问题”是指这个批处理执行过程中会出问题,会得到不正确的结果,还是指什么。

关于 XP 中的 ERRORLEVEL 值,我觉得可以这样来修改一下:

------------------------------------------------------------

@ECHO OFF

IF NOT "%ERRORLEVEL%"=="" GOTO XP

:: 复位变量
FOR %%A IN (1 10 100) DO SET ERR%%A=

:: 检查 ERRORLEVEL 的百位值
FOR %%A IN (0 1 2) DO IF ERRORLEVEL %%A00 SET ERR100=%%A
:: 是否显示 0 前导符
IF "%ERR100%"=="0" IF NOT "%1"=="/0" SET ERR100=

:: 检查 ERRORLEVEL 的十位值
FOR %%A IN (0 1 2 3 4 5 6 7 8 9) DO IF ERRORLEVEL %ERR100%%%A0 SET ERR10=%%A
:: 是否显示 0 前导符
IF "%ERR100%"=="" IF "%ERR10%"=="0" SET ERR10=

:: 检查 ERRORLEVEL 的个位值
FOR %%A IN (0 1 2 3 4 5 6 7 8 9) DO IF ERRORLEVEL %ERR100%%ERR10%%%A SET ERR1=%%A

:: 设置结果
SET ERRORLEV=%ERR100%%ERR10%%ERR1%
:: 限制 ERRORLEV 最大为 255
IF ERRORLEVEL 255 SET ERRORLEV=255
:: 清理临时变量
FOR %%A IN (1 10 100) DO SET ERR%%A=
:: 显示结果
ECHO ERRORLEVEL  %ERRORLEV%
:: 退出
GOTO QUIT

:XP
ECHO ERRORLEVEL  %ERRORLEVEL%

:QUIT

------------------------------------------------------------

在 XP 中居然有 9009 这样的 ERRORLEVEL 值(当你执行了一个错误命令的时候),值真丰富。




`


[ Last edited by stevenldj on 2008-8-21 at 02:13 PM ]

2008-8-21 14:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
stevenldj
初级用户





积分 36
发帖 15
注册 2005-11-26
状态 离线
『第 9 楼』:  

`

简化后果然有问题,原来 ERRORLEVEL 在纯 DOS 下还有这样的表现方式:

当刚进入 DOS 系统的时候,用

ECHO OFF
FOR %%A IN (0 1 2 3 4 5 6 7 8 9) DO IF ERRORLEVEL 2%%A0 ECHO 2%%A0

查看 ERRORLEVEL 的值,居然显示

200
210
220
260
270
280
290

最后确定了一下 ERRORLEVEL 的值是 226

后来执行了一个外部命令,再用这个方法查看 ERRORLEVEL 的值,发现当 ERRORLEVEL 超过 200 的时候,都会出现上面的情况。

看来真的要在批处理过程中限定 ERRORLEVEL 的判断范围。

还是用 Climbing 给的代码准确,注释了一下(加了 XP 的判断):

------------------------------------------------------------
@ECHO OFF

IF NOT "%ERRORLEVEL%"=="" GOTO XP

:: 复位临时变量
FOR %%A IN (1 10 100) DO SET ERR%%A=

:: 检查 ERRORLEVEL 的百位值
FOR %%A IN (0 1 2) DO IF ERRORLEVEL %%A00 SET ERR100=%%A
:: 判断百位是否超过 200,另行处理
IF "%ERR100%"=="2" GOTO 200
:: 是否显示 0 前导符(通过参数判断)
IF "%ERR100%"=="0" IF NOT "%1"=="/0" SET ERR100=

:: 检查 ERRORLEVEL 的十位值
FOR %%A IN (0 1 2 3 4 5 6 7 8 9) DO IF ERRORLEVEL %ERR100%%%A0 SET ERR10=%%A
:: 是否显示 0 前导符(通过百位是否为空判断)
IF "%ERR100%"=="" IF %ERR10%==0 SET ERR10=

:1
:: 检查 ERRORLEVEL 的个位值
FOR %%A IN (0 1 2 3 4 5) DO IF ERRORLEVEL %ERR100%%ERR10%%%A SET ERR1=%%A
:: 检查 小于 250 的情况下的个位值(这里似乎不用判断 250 也可以,下面判断过了)
IF NOT ERRORLEVEL 250 FOR %%A IN (6 7 8 9) DO IF ERRORLEVEL %ERR100%%ERR10%%%A SET ERR1=%%A
GOTO END

:200
:: 当 ERRORLEVEL 大于 200 时的十位值
FOR %%A IN (0 1 2 3 4 5) DO IF ERRORLEVEL 2%%A0 SET ERR10=%%A
:: 当 ERRORLEVEL 大于 250 时的个位值
IF ERR10==5 FOR %%A IN (0 1 2 3 4 5) DO IF ERRORLEVEL 25%%A SET ERR1=%%A
:: 当 ERRORLEVEL 小于 250 时的个位值
IF NOT ERR10==5 GOTO 1

:END
:: 设置结果
SET ERRORLEV=%ERR100%%ERR10%%ERR1%
:: 清理临时变量
FOR %%A IN (1 10 100) DO SET ERR%%A=
:: 显示结果
ECHO ERRORLEVEL  %ERRORLEV%
:: 清理结果变量
SET ERRORLEV=
:: 退出
GOTO QUIT

:XP
ECHO ERRORLEVEL  %ERRORLEVEL%

:QUIT
------------------------------------------------------------


`

2008-8-24 17:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: