このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
今日は、ファイルの先頭行を読み出してみよう。
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]
うまくいったようだ。