4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

バッチファイル入門(for文、配列、遅延環境変数)

Last updated at Posted at 2020-01-22

動機

「○○系の機能の呼び出し元を知りたいから、一覧化して」
と言われて数えてみたら

  • ○○系の機能は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で遊びたいと思う。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?