見出し画像

コマンドプロンプトでdiffしたかった

失敗談です。


ひょんなことから、

「ファイルの差分比較をして、差分をログに吐く」

というバッチスクリプトを作ることに。

シェルであればdiffしてloggerすれば良いだけじゃん、なんて思いながら軽い気持ちで手を付け始めたところ、

バッチとなると知らないことが多かったのでメモ。


バッチにはdiffはなく、代わりにfc(ファイルコンパイル)というコマンドがある。

文字通り二つのファイルを比較(コンパイル)して結果を出力するというシロモノだが、これがなかなかのクセモノだった。


①出力結果に余分な情報が多い

REM 比較対象のファイルは以下
>type test1.txt
aaa
bbb
ccc
ddd
>type test2.txt
aaa
bbb
ccc

REM 出力結果
>fc test1.txt test2.txt
ファイル test1.txtTEST2.TXT を比較しています
***** test1.txt
ddd
***** TEST2.TXT
*****

なんと、ご丁寧に処理中メッセージや差分なしファイル名まで出してくださる。

diffはウダウダ言わずに差分だけを出力してくれる。背中で語るタイプだ。僕はそういうヤツのほうが好きだ。


②文字長にリミットがある

REM 比較対象のファイルは以下
>type test1.txt
01234567891111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122222222223333333333
bbb
ccc
ddd
>type test2.txt
01234567891111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122222222224444444444
bbb
ccc

REM 出力結果
>fc test1.txt test2.txt
ファイル test1.txtTEST2.TXT を比較しています
***** test1.txt
0123456789111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999000000000011111111112222222
2223333333333
bbb
***** TEST2.TXT
0123456789111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999000000000011111111112222222
2224444444444
bbb
*****

***** test1.txt
ddd
***** TEST2.TXT
*****

差分である1行目が127文字を区切りに改行され、さらになぜか2行目まで差分として出力されてしまった。

コマンドプロンプト的にはどういう風に認識してるんだろう?

2行目=1行目の残り文字+実際の2行目みたいなことなんだろうか。差分行の次の行が不憫すぎる。

ちなみに、140文字の行が二行あった場合は以下。

REM 比較対象のファイルは以下
>type test1.txt
01234567891111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122222222223333333333
bbb
01234567891111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122222222223333333333
ccc
ddd
eee
>type test2.txt
01234567891111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122222222224444444444
bbb
01234567891111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122222222224444444444
ccc
ddd

REM 出力結果
>fc test1.txt test2.txt
ファイル test1.txtTEST2.TXT を比較しています
***** test1.txt
0123456789111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999000000000011111111112222222
2223333333333
bbb
***** TEST2.TXT
0123456789111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999000000000011111111112222222
2224444444444
bbb
*****

***** test1.txt
0123456789111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999000000000011111111112222222
2223333333333
ccc
***** TEST2.TXT
0123456789111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999000000000011111111112222222
2224444444444
ccc
*****

***** test1.txt
eee
***** TEST2.TXT
*****

もれなく次の行も出力している。

どうやら差分箇所をわかりやすくするために、あえて後ろの行を表示しているっぽい。

REM 比較対象のファイルは以下
>type test1.txt
水馬赤いな。ア、イ、ウ、エ、オ。

浮藻に小蝦もおよいでる。

柿の木、栗の木。カ、キ、ク、ケ、コ。

啄木鳥こつこつ、枯れけやき。

>type test2.txt
水馬赤いな。ア、イ、ウ、エ、オ。
浮藻に小蝦もおよいでる。

柿の木、栗の木。カ、キ、ク、ケ、コ。

啄木鳥こつこつ、枯れけやき。

REM 出力結果
>fc test1.txt test2.txt
ファイル test1.txtTEST2.TXT を比較しています
***** test1.txt
水馬赤いな。ア、イ、ウ、エ、オ。

浮藻に小蝦もおよいでる。
***** TEST2.TXT
水馬赤いな。ア、イ、ウ、エ、オ。
浮藻に小蝦もおよいでる。
*****

OSの違いですなー(白目)


オチ

①についてはfindstrとかで抽出して対処できるものの、

②についてはケアする工程というか懸念が多すぎたので断念。無理でした。

WindowsとLinuxが混在する環境で、Windows側で実装しなければならない要件もなく、

目的のファイルはsamba領域に出力され、シェルでdiffされることで、ことなきを得ましたとさ。

この記事が気に入ったらサポートをしてみませんか?