如何获取当前行号?

时间:2011-01-05 21:28:08

标签: batch-file cmd

我正在尝试构建一个通用批处理文件,该文件可以使用行号来判断错误,其中出现错误 但是在代码中编写每个行号有点烦人。

当批处理文件正在运行时,是否可以获取当前行号? 以便以下代码可以工作?

@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%
)

1 个答案:

答案 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
)