2011-01-05 41 views
6

私はエラーが発生する行番号でエラーを伝えることができる汎用バッチファイルを構築しようとしています。
しかし、コードの各行番号を書くのはちょっと面倒です。現在の行番号を取得する方法は?

バッチファイルの実行中に現在の行番号を取得することはできますか?
次のコードが動作するようにしますか?

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

答えて

16

方法が常にある...
私は完璧なソリューションが、私は使用することができます良い回避策を見つけていません。

ファンクションパラメータ<uniqueID>に対してfindStrを使用して独自のバッチファイル(%~f0)を検索する関数を呼び出します。これは、これらの<uniqueID>がバッチ全体で本当にユニークな場合にのみ有効です。
linenumberは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 
) 
+4

+1、こんにちはジェブ、私おそらく '/ N/Cを使用するようにFINDSTRの検索を変更する必要があります:-)だけで、非常にクールなこのポストに気づいた:のいずれかの側に "%〜2"'(スペースID)には、IDにはスペースが含まれないという慣例があります。あなたは "abc123"に "zabc1234"をマッチさせたくありません。/Cオプションは、 "A.1"のようなものが正規表現として解釈されないようにします。また、FINDSTRのエスケープの問題を避けるためにIDにバックスラッシュを使用しないでください。そうでない場合は、コード内で\を\で置き換えて検索してください。 – dbenham

関連する問題