2011-01-05 26 views
6

Hata numarası belirten bir satır numarasıyla hatalar söyleyebilen genel bir toplu iş dosyası oluşturmaya çalışıyorum.
Ancak, her satır numarasını kodda yazmak biraz can sıkıcıdır.Geçerli hat numarası nasıl alınır?

Bir toplu iş dosyası çalışırken geçerli satır numarasını almak mümkün mü?
Aşağıdaki kod çalışabilir mi? Her zaman yol yoktur

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

cevap

16

...
Ben mükemmel bir çözüm buldum, ama iyi bir çözüm ben kullanabilirsiniz.

ben işlev parametresi <uniqueID> için, FINDSTR ile kendi toplu dosya (%~f0) arama yapan bir işlevi çağırmak, bu nedenle bu bu <uniqueID> 'ın bütün parti için gerçekten benzersiz durumunda çalışır.
Çamaşır sepeti findstr /N sonucu elde edilir. Bu örnek

:
6: call :getLineNumber errLine uniqueID4711 -2

Üçüncü parametre -2 bir LineNumber ofset eklemek için kullanılır, böylece sonuç 4 olacaktır.

@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 
) 
1, Merhaba Jeb, ben sadece muhtemelen `/ n/c kullanmak için FINDSTR arama değiştirmelisiniz You :-) çok serin bu yazıyı fark
+4

: her iki tarafında "% ~ 2"' (boşluk ID) kimlikleri asla boşluk içermeyen bir sözleşmeyle. "Zabc1234" ile eşleşmesi için "abc123" istemiyorsunuz./C seçeneği ayrıca "A.1" gibi bir ifadeyi bir normal ifade olarak yorumlanmasını engeller. Ayrıca, ID'lerin FINDSTR ile kaçış sorunlarını önlemek için ters eğik çizgi içermemeli veya kodda \\ ile arama yapın ve değiştirin. – dbenham

İlgili konular