我正在尝试构建一个通用批处理文件,该文件可以使用行号来判断错误,其中出现错误 但是在代码中编写每个行号有点烦人。
当批处理文件正在运行时,是否可以获取当前行号? 以便以下代码可以工作?
@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%
)
答案 0 :(得分:18)
总有办法......
我发现不是完美的解决方案,但我可以使用一个很好的解决方法。
我调用一个函数,它使用findStr搜索自己的批处理文件(%~f0
),用于函数参数<uniqueID>
,所以这只适用于这些<uniqueID>
真的是唯一的整批。
亚麻布来自findstr /N
的结果。
在此示例中:
6: call :getLineNumber errLine uniqueID4711 -2
第三个参数-2
用于向亚麻布添加偏移量,因此结果为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
)