1

我们使用检查错误

if !ERRORLEVEL! NEQ 0 (do something)

但这在批处理文件中到处都是。

1)是否有一种方法可以将其封装以在错误时记录并退出程序?

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

4

3 回答 3

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,然后CALLing然后batchaberr.bat分析结果。

这里是aberr.bat

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

请注意,这里没有SETLOCAL(将设置ERRORLEVEL为零)并且例程EXITs.

结果是,如果aberr.bat在,PATH则生成的消息将显示找到的错误级别以及在CALL aberr之后的行上的任何文本CALL aberr

您可以PAUSE在该ECHO %ERRORLEVEL%行之后放置 a 以显示结果,或使用以下命令将结果记录到文件中

>>logfile.txt ECHO %ERRORLEVEL% found %*
于 2013-07-18T04:10:54.443 回答
1

在 1) 如何记录并退出批处理从嵌套批处理文件
中退出 2)如何获取当前行号?

混合它们,你就明白了。

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
)
于 2013-07-18T09:17:54.600 回答
0

使用类似的东西:

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

:LogAndExit
Echo %Date% %Time% - %~1>>Log.txt
Exit /B
于 2013-07-18T08:36:42.500 回答