Как узнать номер текущей строки? - PullRequest
8 голосов
/ 06 января 2011

Я пытаюсь создать общий пакетный файл, который может сообщать об ошибках с номером строки, где происходит ошибка.
Но запись каждой строки в коде немного раздражает.

Можно ли получить текущий номер строки во время работы пакетного файла?
Чтобы следующий код мог работать?

@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 Ответ

18 голосов
/ 13 января 2011

Всегда есть способ ...
Я нашел не идеальное решение, но хороший обходной путь, который я могу использовать.

Я вызываю функцию, которая ищет собственный пакетный файл (%~f0) с помощью findStr для параметра функции <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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...