2011-01-05 19 views
6

Estoy intentando construir un archivo por lotes genérico que pueda detectar errores con un número de línea, donde se produce el error.
Pero escribir cada número de línea en el código es un poco molesto.¿Cómo obtener el número de línea actual?

¿Es posible obtener el número de línea actual, mientras se está ejecutando un archivo por lotes?
¿Para que el siguiente código pueda funcionar?

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

Respuesta

16

Siempre hay manera ...
No he hallado la solución perfecta, pero una buena solución que puedo usar.

que llamo una función que busca en el archivo por lotes propia (%~f0) con findstr, para el parámetro de la función <uniqueID>, así que esto sólo funciona si estos <uniqueID> 's son realmente única para todo el lote.
El número de lienzo se obtiene del resultado de findstr /N.

En esta muestra:
6: call :getLineNumber errLine uniqueID4711 -2

El tercer parámetro -2 se utiliza para añadir un desplazamiento a la LineNumber, por lo que el resultado será 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 
) 
+4

+1, Jeb Hola, me he dado cuenta de este post, muy fresco :-) Probablemente debería cambiar su búsqueda FINDSTR usar '/ n/c: "% ~ 2" '(espacio a ambos lados de ID) con una convención de que los ID nunca contienen espacio. No desea que "abc123" coincida con "zabc1234". La opción/C también evita que algo como "A.1" se interprete como una expresión regular. Además, los ID no deben contener una barra diagonal inversa para evitar problemas de escape con FINDSTR, o bien buscar y reemplazar \ con \\ en el código. – dbenham

Cuestiones relacionadas