バッチファイルでファイルを結合する


Y子です。
今回は、ファイルを結合する方法を考えます。

難しいバッチファイルは作りません。
このバッチファイルは、簡単なコマンドを使って、現場でその場で作れることが大事です。
確認環境:Windows 10 Home (Bld. 19042.928)

概要・用途

ファイルを結合します。
バイナリファイルでもテキストファイルでも、同じように結合できます。

わたしは下記のようなことがあり、必要に迫られて覚えました。

用途(例)
1時間区切りのバイナリログを出力する機器がある。
これを1週間程度動作させておき、ログを解析する。
1日の中でどのような傾向を示すのか知りたいため、1日単位のログにしたい。
ログを24時間単位で結合してから変換ツールにかけると、見やすくなる。

まったく同じ需要はなかなかないと思いますが(笑)、まあそこはそれ。

コード

(1) コマンド例(最初の既存ファイルに追記)

> copy /b 01a.log + 01b.log + 01c.log + 01d.log

ファイルを+でつなげて書くと、1番目のファイルに2番目以降の内容が追記されます。
既存のファイルが更新されてしまうので、注意が必要です。
この例では、01a.logが更新されて、4ファイル分がまとまります。

(2) コマンド例(最後の新規ファイルに結合)

> copy /b 01a.log + 01b.log + 01c.log + 01d.log 01.log

ファイルを+でつなげ、最後に+無しでファイル名を書くと、最後のファイルが結合後のファイルになります。
この例では、01.logが新しくできて、4ファイル分がまとまります。

(3) コマンド例(ワイルドカード)

> copy /b 01*.log 01.log

ワイルドカードも使えます。
01*.logに該当するファイルがすべて結合され、01.logにまとまります。

(4) バッチファイル例(指定した日付のファイルを結合)

RcvLog_20210430_00.logRcvLog_20210430_23.logのファイルが1フォルダ(C:\log dir)に格納されているような場合を想定したバッチファイルです。
引数に日付を与えることで、繰り返し使えるようにしました。

merge_logfile.bat
@echo off

rem 引数がない場合は終了する
if "%~1"=="" (echo 引数がありません & pause & exit /b)

set str_date=%~1

cd "C:\log dir"
copy /b RcvLog_%str_date%_*.log RcvLog_%str_date%.log
実行結果
> merge_logfile.bat 20210430
RcvLog_20210430_00.log
RcvLog_20210430_01.log
RcvLog_20210430_02.log
RcvLog_20210430_03.log
※中略※
RcvLog_20210430_23.log
        1 個のファイルをコピーしました。

おわりに

最初(1)の書き方しか知らず、1番目のファイルが書き換えられて焦りました。
(3)のワイルドカードを使う場合、似た名前のファイルをうっかり置いてしまうと一緒に結合されてしまいます。
愚直に(2)のような書き方をした方が、期限が迫った現場にいらぬ混乱を与えることもなくて良いと思います。
上記バッチファイルはワイルドカードを使っちゃいましたが!(だって楽だし…)

ではでは!