†DOSとバッチとスクリプト†

バッチでテキストファイルの先頭1行を取得する

作成開始日 2024.08.25
最終更新日

方法1:単純にテキストファイルの1行目を取得する

以下では、「myfile.txt」の1行目を環境変数「st」に読み込み、読み込んだ行を表示している。
SET /P st=<myfile.txt
ECHO %st%
ミソはSETコマンドの/Pオプション。本来、これは環境変数にプロンプトからの入力を代入する命令。それに、テキストファイルをリダイレクトしている。でもって、ファイルの先頭行末の改行コードが[Enter]に相当するので、これで先頭1行が読み込まれることになる。

尤も、この/Pオプションって、かなり気持ちの悪い仕様なんだよな。基本型は;
  SET /P age="あなたの年齢を入力してください"
みたいなカンジで、変数にメッセージを代入しているように読めてしまう。普通に考えると、上記のようにテキストファイルをリダイレクトすると、テキストファイルの中身がメッセージとして表示されるような気がするのだが…

この方法は簡便ではあるが、単純にファイルの1行目が読み込まれるだけで、他の機能はない。データを分解して必要項目を取り出すには、別途処理が必要になる。できれば、データファイルの読み込み段階でデータを分解できる方が望ましい。

方法2:FORループを1回だけ回して脱出する

次の例では、1行が「名前(TAB)年齢(TAB)番号」という形式のデータファイル「mydata.txt」から、最初の行の各項目のデータを読み出している。
FOR /F "tokens=1-3" %%a IN (mydata.txt) DO (
SET name=%%a
SET age=%%b
SET id=%%c
GOTO :break
)
:break
この方法のキモは、GOTO命令でループ処理を1回で抜ける点。これによって、先頭行のデータが変数に代入される。なお、最後までループを回すと、最終行のデータが代入される。また、FOR文のskipオプションを指定することで、任意行のデータを代入することもできる。次の例では3行スキップして、4行目のデータを代入している。
FOR /F "tokens=1-3 skip=3" %%a IN (mydata.txt) DO (
SET name=%%a
SET age=%%b
SET id=%%c
GOTO :break
)
:break
なお、バッチの書式は融通が効かないので注意。たとえば、以下のような書式はコンパクトで視認性も良いが、バッチではエラーになる。
FOR /F "tokens=1-3" %%a IN (mydata.txt) DO (
SET name=%%a & SET age=%%b & SET id=%%c & GOTO :break ) &:break
まず、GOTOの宛先のラベルは行頭にないとダメ。したがって、上記のような書式ではGOTOは機能しない。また、SETコマンドを「&」で繋げる場合は、スペースの有無に注意する必要がある。上記の例では「%%a」や「%%b」のあとに半角スペースがくっついてしまう。これを避けるには、以下のようにスペースを詰める必要がある。
SET name=%%a& SET age=%%b& SET id=%%c& …
一般的なプログラム言語では半角スペースは割とルーズに扱えるが、バッチでは扱いがシビア。可読性を高めるために、適宜スペースを追加するというような事はしない方が賢明。


【DOSとバッチとスクリプト目次】 【ホーム】