今日は、ファイルの先頭行を読み出してみよう。

Windows 環境には、ファイルの部分行を得るコマンドがない。
Linux などでは、head コマンドが使えるのだが。
仕方ないので、for コマンドを逆用する。

for コマンドは、テキストファイルの各行を
トークンに分割する機能があるが、
これを抑止すれば、行単位で繰り返すことができる。

for の delims オプションに文字を指定しなければ、
トークンの分割を抑止することができる。
さらに、eol オプションに文字を指定しなければ、
行末までの文字列を全て読み出すことができる。

for /f "usebackq delims= eol=" %s in ("パス") do @echo %s

ここで先頭行だけを残すためには、
一度目の繰り返しの時点で繰り返しを抜ければいいのだ。
コマンドプロセッサには、for から抜けるコマンドはないが、
goto コマンドを使うと、任意の位置に飛ぶことができる。

for /f "usebackq delims= eol=" %s in ("パス") do @(
    echo %s
    goto break;
)
:break

バッチファイル中で goto コマンドを使うと、
ファイルの任意の位置に制御を移すことができる。
goto の引数には制御を移す先のラベル名を書く。

ラベル名は行に単独で出現し、
コロン「:」に続けて英数字で任意の名前をつける事ができる。
これを「ラベル」コマンドと呼……(以下略)

バッチファイルにプログラムを書く場合、
バッチファイル中のコマンドに特殊変数を渡す場合は、
特殊変数の % 記号を 2 つ書く必要がある。

2 つ書かなかった場合、
for コマンドをコマンドプロセッサが読み取る最中に、
%s を展開しようとしてしまうからだ。

%%s としておくと、for コマンドに渡される時には、
コマンドプロセッサによって %% が % と解釈され、
%s として渡される。

========== test.cmd ==========
@echo off

for /f "usebackq delims= eol=" %%s in ("%~1") do @(
    echo %%s
    goto break;
)
:break
===== end of test.cmd ==========

実行してみよう。

C:\>test C:\boot.ini
[boot loader]

うまくいったようだ。