動機
「○○系の機能の呼び出し元を知りたいから、一覧化して」
と言われて数えてみたら
- ○○系の機能は150弱
- Javaファイルは15000個
あったので、IDE使って150回検索するのも辛そうだったのでバッチファイルで何とかしてみた。
何故bashじゃないのかとか何故そんなことしないといけないのかは聞かないでほしい。
作った bat
ファイルと実行結果
grepCallHierarchy.bat
@echo off
setlocal enabledelayedexpansion
set i=0
for /f %%a in (targetList.txt) do (
set /a i+=1
echo !i! %%a
call set Arr[!i!]=%%a
)
pause
for /r %%a in (*.java) do (
for /f "tokens=1,2,3 delims= " %%b in (%%a) do (
for /l %%j in (1,1,%i%) do (
if !Arr[%%j]!==%%c (
echo %%a %%b %%c %%d
)
)
)
)
targetList.txt
NantokaComponent
KantokaComponent
出力
C:\path\to\file1.java private NantokaComponent nantokaComponent;
C:\path\to\file2.java private KantokaComponent kantokaComponent;
感想(学んだこと)
for文
色んなfor文の練習になった。
- 拡張子でディレクトリ内を再帰でファイル検索
for /r %%a in (*.java) do
- ファイルを1行ごとに読み出し(delimiter(デリミタ)を使う練習も兼ねて)
for /f "tokens=1,2,3 delims= " %%b in (%%a) do
- jをインクリメントしながらループ
for /l %%j in (1,1,148) do
配列
call set Arr[!i!]=%%a
初めて知ったんですが、バッチファイルは配列がないんですね。
Arr[1]
Arr[2]
... という変数をただひたすら作ってるだけらしい。
遅延環境変数
setlocal enabledelayedexpansion
配列を添え字でループさせたいとき、遅延評価させないとずっと Arr[1]
(初期値)になってしまうらしい。
むずかしい。。
遅延評価したい部分は、 Arr[%i%]
ではなく Arr[!i!]
のようにびっくりマークで囲うんだそう。
びっくり。
総評
楽しかった。(小並感)
作ってる途中で、そういえばPowerShellもあったな、と思った。
次はPowerShellで遊びたいと思う。