我们使用检查错误
if !ERRORLEVEL! NEQ 0 (do something)
但这在批处理文件中到处都是。
1)是否有一种方法可以将其封装以在错误时记录并退出程序?
2)如何记录导致错误的bat文件行号?
我们使用检查错误
if !ERRORLEVEL! NEQ 0 (do something)
但这在批处理文件中到处都是。
1)是否有一种方法可以将其封装以在错误时记录并退出程序?
2)如何记录导致错误的bat文件行号?
@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
ing然后batchaberr.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
。
您可以PAUSE
在该ECHO %ERRORLEVEL%
行之后放置 a 以显示结果,或使用以下命令将结果记录到文件中
>>logfile.txt ECHO %ERRORLEVEL% found %*
在 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
)
使用类似的东西:
...
if !ERRORLEVEL! NEQ 0 Call :LogAndExit "some explanation"
...
GoTo :EOF
:LogAndExit
Echo %Date% %Time% - %~1>>Log.txt
Exit /B