Board logo

标题: 怎样在纯 DOS 下随时查看 ERRORLEVEL 的值? [打印本页]

作者: stevenldj     时间: 2008-8-20 23:20    标题: 怎样在纯 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

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


作者: Climbing     时间: 2008-8-21 03:09
参考链接: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%

作者: stevenldj     时间: 2008-8-21 09:37

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

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

@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 ]
作者: stevenldj     时间: 2008-8-21 09:50
`

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

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

能不能写成

IF NOT %1#==/0#

IF NOT %1==/0

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

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



`

[ Last edited by stevenldj on 2008-8-21 at 10:35 AM ]
作者: Climbing     时间: 2008-8-21 09:52
楼上的,你精简的有问题,最好按照人家的原样运行。
作者: stevenldj     时间: 2008-8-21 10:31
我在 DOS 下用 DREADY 测试过了,可以正确显示 ERRORLEVEL 的值,包括 255,不知道问题在哪里,请指明,谢谢
作者: Climbing     时间: 2008-8-21 11:10
你精简后,组合中会出现超过255的值,这有可能造成问题。原批处理是充分考虑到这些特殊情况的。另外,我发现这个批处理无法运行在XP环境下,因为XP的for命令会设置errorlevel值为1。
作者: stevenldj     时间: 2008-8-21 14:07
`
组合中超过 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 ]
作者: stevenldj     时间: 2008-8-24 17:35
`

简化后果然有问题,原来 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
------------------------------------------------------------


`