I'm trying to build a generic batch file that can tell errors with a line number, where the error occours.
But writing each line number in the code is a little bit annoying.
Is it possible to get the current line number, while a batch-file is running?
So that the following code can work?
@echo off
call :doSomething 1
if %errorlevel% GTR 0 (
REM Do something magic, to retrieve the lineNo
call :getCurrentLineNo currentLineNo
echo Error near %currentLineNo%
)
call :doSomething 2
if %errorlevel% GTR 0 (
call :getCurrentLineNo currentLineNo
echo Error near %currentLineNo%
)
The standard solution to find the current line number in C++ is using the predefined macro __LINE__ . It returns the integer value representing the current line in the source code file being compiled. The preprocessor will simply replace the __LINE__ macro with the current line number.
The java. lang. StackTraceElement. getLineNumber() method returns the line number of the source line containing the execution point represented by this stack trace element.
There is always way...
I found not the perfect solution, but a good workaround I can use.
I call a function which searches the own batch file(%~f0
) with findStr, for the function parameter <uniqueID>
, so this works only if these <uniqueID>
's are really unique for the whole batch.
The linenumber is get from the result of findstr /N
.
In this sample:6: call :getLineNumber errLine uniqueID4711 -2
The third parameter -2
is used to add an offset to the linenumber, so the result will be 4
.
@echo off
SETLOCAL EnableDelayedExpansion
dir ... > nul 2> nul
if %errorlevel% NEQ 0 (
call :getLineNumber errLine uniqueID4711 -2
echo ERROR: in line !errLine!
)
set /a n=0xGH 2> nul
if %errorlevel% NEQ 0 (
call :getLineNumber errLine uniqueID4712 -2
echo ERROR: in line !errLine!
)
goto :eof
:::::::::::::::::::::::::::::::::::::::::::::
: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 you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With