我们使用
检查错误if !ERRORLEVEL! NEQ 0 (do something)
但这在批处理文件中随处可见。
1)是否有办法将其封装为记录并在出错时退出程序?
2)如何记录导致错误的bat文件行号?
答案 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