バッチでスペース区切りファイルを 1 行ずつ読む方法

隣の席の N さんと相談しながらやってみた。
以下のような感じで作成し、これにリダイレクト使ってファイルを渡せばいい。
で、別ファイル proc.bat に「1 行分の処理」を書いておけば、行内の各「フィールド」の値が、その引数 (%1、%2……) として取得できる。

@ECHO OFF

:FIRST

SET LINE=
SET /P LINE=

IF "%LINE%"=="" GOTO :EOF

SET SUBLINE=%LINE:~0,1%
IF "%SUBLINE%"=="#" GOTO :FIRST 

CALL proc.bat %LINE%

GOTO :FIRST

ポイントになっているのは、

  • 1 行分の入力を、SET /P で取得
  • 別 bat に 1 行渡すことで、1 行を分割
  • CALL コマンドを使わないと、proc.bat を 1 回実行して帰ってこない。

というあたりか。個人的には、左辺・右辺のいずれかが空になると、IF 文での文字列比較がエラーになる、というのも初めて知った。上記で引用符使って囲っているのはこのためだ。逆にいうと、引用符は片方だけでもよく、さらに言えば引用符である必要もない。見た目のそれっぽさで「両側に引用符」にしただけである。
ちなみに、EOF と空行を区別する方法が見つからなかった。そのため、上のバッチでは、渡したファイルに空行があるとそこで処理が終了してしまう、という制限事項がある。
そのかわりに、N さんがコメント行を使えるようにしてくれた。行頭が # だとコメント行になる。「どうしても 1 行あけたい時は、コメントでガマンしてもらえばいいです」。