8. Windows - バッチ - ファイルの内容やサイズを取得

 
8.1 前提
8.2 ファイル内の文字列を取得する
8.3 ファイルの行数を数える
8.4 ファイルの最終行のファイル内の文字列を取得する
8.5 ファイルサイズを取得する

8.1 前提

 ここで言っているファイルというのはテキストファイルを指します。  以下の項目で処理可能なのは、改行コードが CR LF であるテキストファイルのみです。

8.2 ファイル内の文字列を取得する


FOR /F "DELIMS=" %%A in (ファイル名) DO (ECHO %%A)
 DELIMS= にはデリミタとして設定する文字列をいれます。  DELIMS= を省略するといわゆるホワイトスペースをデリミタとして解釈します。  TOKENS= というオプションを指定すると、デリミタで区切られた TOKEN の部分を取得することができます。  TOKENS= を指定しない場合、先頭の TOKEN のみ取得します。  つまり、DELIMSTOKENS も指定しない場合、ホワイトスペースで区切られた先頭の1単語のみ取得することになります。  改行のみの行は、取得するものがないので無視されます。

8.3 ファイルの行数を数える

 下記のバッチファイルを実行すると改行のみの行以外の行数を出力します。

@ECHO OFF
SET LINE_NUMBER=0

FOR /F %%A IN (ファイル名) DO (
    SET /A LINE_NUMBER+=1
)

ECHO %LINE_NUMBER%

SET LINE_NUMBER=0
 は、実はなくてもいいようです。  はじめて出現した変数の初期値は 0 に設定されているようです。  まあ、初期化はいれておく方がお行儀がよいですね。

    SET /A LINE_NUMBER+=1
 は、インクリメントです。

    SET /A LINE_NUMBER=LINE_NUMBER+1
 という書き方をしても結果は同じですが、C言語風の演算子が使えるのですね。  この場合、行数を数えるだけなので

@ECHO OFF
SET LINE_NUMBER=0

FOR /F %%A IN (ファイル名) DO (SET /A LINE_NUMBER+=1)

ECHO %LINE_NUMBER%
 と書くのがよりスマートな書き方です。

8.4 ファイルの最終行のファイル内の文字列を取得する

 下記の内容の TEST.TXT というファイルが存在して

AAAA BBBB CCCC DDDD
EEEE FFFF GGGG HHHH
IIII JJJJ KKKK LLLL
 最終行の、TOKEN の1番目と3番目、つまり IIIIKKKK を取得して、変数1、変数2にいれる場合

FOR /F "TOKENS=1,3" %%A IN (TEST.TXT) DO (
	SET 変数1=%%A
	SET 変数2=%%B
)
 と書きます。  FOR で読込を行う場合、特に指定しなければ、最終行まで勝手に読みこんでいきます。  TOKEN の1番目と3番目を変数 %%A に入れていますが、2つ目にとった3番目の TOKEN は、%%A の次のアルファベットの変数にはいります。  すなわち %%B になるわけです。  この論理で行くと、変数に %%Z なんかは使用したくないですね。  最終行まで読みこんだ、最後の1番目と3番目の値が設定された状態で、次の処理に移行するので、結果的に最終行を取得したことになります。  数百万行もあるようなファイルは相手にできないですね。

8.5 ファイルサイズを取得する

 ファイルサイズを取得するには

FOR %%F in (ファイル名) DO SET ファイルサイズ変数=%%~zF
 これで「ファイルサイズ変数」にファイルのサイズがはいります。  %%~zFFFOR の後の %%FF と連動しています。