id:eel3:20080608で、カレント以下のディレクトリにある全ソースファイルの行数をカウントする方法を書いた。コマンドプロンプト上では個々のファイルの行数をカウントすることはできたけれども、行数の合計を出すことまではできなかった。
シェルスクリプトで逆引用符を使った場合のように、カレントディレクトリ以下にある全ソースファイル名をピックアップし、それをwcの引数に指定できれば行数の合計も表示されるはずだ。
ただ、コマンドプロンプトにも逆引用符みたいな機能があるのだが、Unixのfindみたいなコマンドが分からなかった。そこでfor文でピックアップしたファイル名を変数に格納してから、その変数を引数としてwcを実行してみた。
@echo off :: lc.bat :: カレントディレクトリ以下のファイルの行数を求める setlocal enabledelayedexpansion set FILES= for /r %%i in (*.c *.h) do ( set FILES=!FILES! %%i ) if "%FILES%" NEQ "" ( wc -l %FILES% ) endlocal
$ lc.bat 158 D:\archive\util\src\linux\fs\bitmap.c 86 D:\archive\util\src\linux\fs\block_dev.c #-------------- 長いので中略 -------------- 264 D:\archive\util\src\linux\mm\memory.c 68 D:\archive\util\src\linux\tools\build.c 8413 合計
遅延環境変数の展開を有効にすること(setlocalのオプションに注目)。でないと間抜けなことになる。例えば最後のファイル(この例ではbuild.c)の行数しか出力されないとか。
この方法にはバグがある。パスに半角空白が含まれていると正常動作しないのだ。環境変数 FILESにファイル名を追加する際に""で囲めないが試してみたが、うまくいかなかった。
ところで環境変数の大きさに制限はあるのだろうか? ファイル数が多くなった時に正常動作するかどうか不明だ。