如何减少检查错误所需的代码

时间:2013-07-18 03:28:54

标签: batch-file

我们使用

检查错误
if !ERRORLEVEL! NEQ 0 (do something)

但这在批处理文件中随处可见。

1)是否有办法将其封装为记录并在出错时退出程序?

2)如何记录导致错误的bat文件行号?

3 个答案:

答案 0 :(得分:2)

@ECHO OFF
SETLOCAL
ECHO y|FIND "y" >NUL
CALL aberr matching y and y
pause
ECHO x|FIND "y" >NUL
CALL aberr matching x and y
pause
ECHO y|FIND "z" >NUL
CALL aberr matching y and z
pause

GOTO :EOF

以上是一个测试场景,将errorlevel连续设置为0,1,1,然后CALL然后批量aberr.bat来分析结果。

这是aberr.bat

@ECHO OFF
IF %ERRORLEVEL%==0 GOTO :EOF
ECHO %ERRORLEVEL% found %*
EXIT

请注意,没有SETLOCAL(将ERRORLEVEL设置为零)和例程EXIT s。

结果是如果aberr.bat上有PATH,则生成的消息会显示找到的错误级别以及CALL aberr之后CALL aberr行上的所有文字。< / p>

您可以在PAUSE行后面放置一个ECHO %ERRORLEVEL%来显示结果,或者使用

将结果记录到文件中
>>logfile.txt ECHO %ERRORLEVEL% found %*

答案 1 :(得分:1)

at 1)如何记录和退出批次Exit from nested batch file
在2)How to get the current line number?

混合它们就可以了。

setlocal EnableDelayedExpansion
cd. & REM *** Set the errorlevel to 0
if %errorlevel% NEQ 0 (
    call :getLineNumber errLine uniqueID4711    -2
    call :log ERROR: in line !errLine!
)

set /a n=0xGH 2> nul & REM Force the errorlevel to !=1
if %errorlevel% NEQ 0 (
    call :getLineNumber errLine uniqueID4711    -2
    call :log ERROR: in line !errLine!
)
echo all OK
exit /b

:log
>error.log echo %*
call :HALT
exit /b

:HALT
call :__halt 2> nul
exit /b

:__halt
()

:::::::::::::::::::::::::::::::::::::::::::::
:GetLineNumber <resultVar> <uniqueID> [LineOffset]
:: Detects the line number of the caller, the uniqueID have to be unique in the batch file
:: The lineno is return in the variable <resultVar> add with the [LineOffset]
SETLOCAL
for /F " usebackq tokens=1 delims=:" %%L IN (`findstr /N "%~2" "%~f0"`) DO set /a lineNr=%~3 + %%L
( 
  ENDLOCAL
  set "%~1=%LineNr%"
  goto :eof
)

答案 2 :(得分:0)

使用类似:

...
if !ERRORLEVEL! NEQ 0 Call :LogAndExit "some explanation"
...
GoTo :EOF

:LogAndExit
Echo %Date% %Time% - %~1>>Log.txt
Exit /B