😁

WinMerge 自動化

2024/02/12に公開

はじめに

こんにちは!さいとうです。
今回は、複数のフォルダやファイルを比較する際に使用するWinMergeについて、記事を書いていこうと思います!!!

皆さんはWinMergeを使ったことはありますか?自分は普段の業務で、新旧のサーバーの環境変数を比較する際に使用しています。その際、エビデンスも残さないといけないので、それぞれの環境変数をWinMergeに張り付けた後、レポート生成、なんて作業を手動でやっています。。。

10回くらいなら手動で、、、と思っても、50回、100回、、となると気が狂いそうですよね。

そこで今回は、バッチファイル(Windows環境でコマンド実行できるテキストファイルのこと)を作って、ファイル比較を自動化してみました。

自動化する目的

  • 今後もエビデンスを取ることがあるので、シンプルに作業を楽にするため。
  • 日々ググるなかで、有益な情報を提供してくださるエンジニアさんに向けて、今度は私からその情報を還元するため。

さっそく自動化!!

自動化のイメージ!

  1. 自動化スタート!!
  2. バッチファイルをダブルクリック(バッチファイル起動
  3. WinMergeがフォルダに格納してある2つをファイルを比較する
  4. 比較した結果をレポートとして生成する
  5. テキストファイル比較とレポート生成をn回繰り返す(今回は10回)
  6. レポートの結果がまとめて格納される
  7. おわり!!

なんとシンプルではないか。。?!

用意するもの

マシンとソフトウェア

  • WindowsPC(コマンドプロンプトを使いたいからね)
  • WinMerge
  • 遊んでもいいフォルダ(自分はLocal Disk(C:)の配下に作りました~)

マストなもの

・比較したいテキストファイル(textfile01とtextfile02)
・テキストファイルを格納するためのフォルダ(ディレクトリ)(diff_test_1、diff_test_2、、)
・WinMerge自動化バッチファイル(autoWinmerge.bat)

以下はお好みで。

  • フォルダを複製するバッチファイル(make_dir.bat)
    比較したいテキストファイル(textfile01とtextfile02)がフォルダに格納され、その後フォルダが10個複製される。本当はフォルダごとに異なるテキストファイルを格納して、フォルダごとで比較を実施したかったが、テキストファイルを作るのが面倒だったので、ダミー変数的なやつを作った。

  • フォルダを一括削除するバッチファイル(delete_dir.bat)
    各フォルダの上位にフォルダtestが存在しており、それを一括で削除する。for文を使って一回一回フォルダを消すようなコードを書くのが面倒だったので、一括で消せるようにしている。

ディレクトリのイメージ

C:\
├── temp
│   └── test
│      └── diff_test_1
│      └── diff_test_2
│      └── diff_test_3
│      └── ................
│   └── 20240212_diff_result
│   └── 20240213_diff_result
│   └── 20240214_diff_result
│   └── ......................
├── test_bat
│   ├── autoWinmarge
│   └── make_dir
│   └── delete_dir
│   └── textfile01.txt
│   └── textfile02.txt
  • make_dirを起動すれば、testとその配下にdiff_test_(xx)が生成され、delete_dirを起動すれば、testが削除される仕組み。
  • autoWinmarge.batを起動する前はyyyymmdd_diff_result(エビデンスを取得した日付が記載されたフォルダ)は生成されません。
  • autoWinmarge.batを起動した後は、yyyymmdd_diff_resultをtemp配下に生成する。

完成品

自動で差分を比較してくれるやつ(autoWinmarge.bat)

autoWinmarge.bat
@echo off

set yyyy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%

mkdir C:\temp\%yyyy%%mm%%dd%_diff_result

timeout /t 3 /nobreak


:遅延環境変数の宣言
setlocal enabledelayedexpansion
set val = 1
set exe_winmerge=C:\Program Files\WinMerge\WinMergeU.exe

for /L %%n in (1,1,10) do (
	set /a val += 1
	set left_folder=C:\temp\test\diff_test_!val!\testfile01.txt
	set right_folder=C:\temp\test\diff_test_!val!\testfile02.txt
	start "" "%exe_winmerge%" !left_folder! !right_folder! /or C:\temp\%yyyy%%mm%%dd%_diff_result\diff_test_!val!.html /noninteractive
)    

フォルダを複製するバッチファイル(make_dir.bat)

make_dir.bat
@echo off

:遅延環境変数の宣言
setlocal enabledelayedexpansion
set val = 1

for /L %%n in (1,1,10) do (
	set /a val += 1
	mkdir c:\temp\test\diff_test_!val!
	copy  C:\test_bat\*.txt c:\temp\test\diff_test_!val!
)

フォルダを一括削除するバッチファイル(delete_dir.bat)

delete_dir.bat
@echo off

echo Y | rmdir /s c:\temp\test

おわりに

はじめての自動化で時間はかかりましたが、楽しかったです!
需要があればこのコードの解説とかも載せようと思います。
あと、バッチファイルではwhile文みたいなのが無いので、for文で仕方なく回数を設定しています。いい方法があれば是非コメントくださいね!(Zeenってコメントかけるのか知らんけど笑)
ではまた!

Discussion