treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

Windows11でFCコマンドを簡単に実行するバッチファイル

必要に迫られたので、Windows11環境でテキストファイルを比較するバッチファイルを作成してみましたのでご報告です。
おそらく旧WindowsでもFCコマンドが使えれば可能だと思います。

テキストファイルの中身を比較したい

テキストファイルの内容を比較して相違する点があるかないかを簡単に確認したいと考えました。テキストファイルである.txtや.log、.csvだけでなく、設定ファイルの.iniとか.xml/.jsonのような設定ファイルなんかも比較したいときはあります。

以前に<ファイルの差分を比較したいときWinMargeが便利 - treedown’s Report>にてフリーソフトを使ったファイル比較(差分検出)をやってみたのですが、ソフトが使えないPC環境で差分を確認したいときはコマンドで実行する必要があります。その時にはFCコマンドを使ってファイルの差分を取得できます。

オプションを覚えなくても使えるように

FCコマンドのオプションを覚えておくとdiffのように使用できるのですが、基本の形をバッチファイルにして簡単に比較できるようにしたらいいんじゃないかとと思いました。

※バッチファイル

--------------------------------------------------------------

@echo off
color 07
setlocal
rem 比較に使っているfc は文字コード差異で見づらい時があります。
rem UTF-8/BOMなどの比較をする場合にはfc /b(バイナリ比較)に修正する必要があります。
set FDir=
set CFile1=
set CFile2=
rem set UsePushd=0
rem ログファイル処理(ログ出力処理の場合だけ使用する)
set "LOGDIR=%~dp0"
set "DATETIME=%date:~0,4%%date:~5,2%%date:~8,2%-%time: =0%"
set "DATETIME=%DATETIME::=%"
set "DATETIME=%DATETIME:.=%"
set "LOGFILE=%LOGDIR%Diff_%DATETIME%.txt"
rem ここまで


if not "%~3"=="" (
       echo コマンドでの比較は3つ以上のファイルを比較できません。
       echo ファイルは2つだけドラッグしてください。処理を終了します。
       pause
       exit /b
)
rem バッチにドラッグ&ドロップした場合、手入力を省略しファイル比較を実行する
if not "%~2"=="" goto DragDropMode
rem ドラッグ&ドロップが検出されない場合には手入力に移動します。
goto InputDirName

:DragDropMode
set "CFile1=%~1"
set "CFile2=%~2"
rem set "FDir=%~dp1"
echo ドラッグ&ドロップモードで実行します。
goto Compare

:InputDirName
set /p FDir="比較するファイルが保存されたディレクトリ >"

if exist "%FDir%\*" goto InputFileName1
rem ディレクトリがが存在しない場合
echo msg:そのディレクトリは存在しないので、再入力してください。
goto InputDirName


:InputFileName1
set /p CFile1="比較されるファイル名を入力 >"
       if exist "%FDir%\%CFile1%" goto InputFileName2
       rem ファイル1(%CFile1%)が存在しない場合
       echo msg:そのファイル(%CFile1%)は存在しないので、再入力してください。
goto InputFileName1

:InputFileName2
set /p CFile2="比較対象のファイル名を入力 >"
       if exist "%FDir%\%CFile2%" goto confirmation
       rem ファイル1(%CFile2%)がが存在しない場合
       echo msg:そのファイル(%CFile2%)は存在しないので、再入力してください。
goto InputFileName2

:confirmation
rem pushd "%FDir%"
set UsePushd=1
echo "%FDir%"にある"%CFile1%"と"%CFile2%"を比較します。
set "CFile1=%FDir%\%CFile1%"
set "CFile2=%FDir%\%CFile2%"
pause

:Compare
color 0B
echo (
echo "%CFile1%" と "%CFile2%" の差分検出中...
echo (
rem ログファイルの出力(先に実行します。)
rem echo ログを%LOGFILE%に保管します。
echo '---------------------------------------------->"%LOGFILE%"
echo title:FCファイル比較実行結果>>"%LOGFILE%"
echo 実行日時 %DATE% %TIME%>>"%LOGFILE%"
echo Compare Source : %CFile1% >>"%LOGFILE%"
echo Compare Target : %CFile2% >>"%LOGFILE%"
echo '---------------------------------------------->>"%LOGFILE%"
fc "%CFile1%" "%CFile2%" >>"%LOGFILE%" 2>&1
rem ログファイルの出力はここまで以下画面出力
fc "%CFile1%" "%CFile2%"
if errorlevel 2 (
       echo (
       color 0C
       echo 比較中にエラーが発生しました。エラー内容を確認してください。
) else if errorlevel 1 (
       echo (
       color 0E
       echo ファイルに差異があります。差異は画面表示された差分を確認してください。
) else (
       echo (
       color 0A
       echo 二つのファイルは同一です。
)
echo 比較処理は完了しました。
pause
color 07

rem if "%UsePushd%"=="1" popd
set FDir=
set CFile1=
set CFile2=
rem set UsePushd=0
set "LOGDIR="
set "LOGFILE="
endlocal
exit /b

--------------------------------------------------------------

使い方(簡易版)

比較したい二つのファイルをドラッグ&ドロップするだけで比較できるように作成しました。

フォルダ内のファイル(画像では「test.bat」と「test - コピー.bat」)を両方選択して、バッチファイル(diffc.bat)へドラッグ&ドロップします。

すると、

FCコマンドを実行して比較した結果が表示されます。

この実行結果は、

バッチファイルと同じ場所に格納されて、あとで見返すことができるようにしました。

使い方(手動実行)

バッチファイル単体で起動しても比較いるを指定することができるようにしました。

バッチをダブルクリックなどで起動すると、

ファイルの保存場所を聞いてくるようにしました。ここで、

この場所のファイルを比較する場合、

アドレス欄に表示されているフォルダへのパスを入力します。

そのあと、比較したいファイル名を

両方の比較するファイル名をそれぞれ入力します。

両方のファイルを入力すると、

ファイルの場所と二つのファイル名が確認のため表示されるようにしました。

キーを押すと

差異があるファイルであれば相違点が表示されます。

ログファイルも同様に出力されるようにしました。

テキストベースでファイル比較なら使えそう

Windows標準機能で実現しているので、アプリケーションを導入できない環境ではこのバッチでテキストファイルの比較ができるようになりました。

より高機能なフリーソフトを使った方がいいけど、その高機能なフリーソフトが導入できない環境であれば、バッチファイルで代替するという手が使えそうです。

なお、最終行を「exit /b」にしたので、他のバッチから「call diffc.bat」のようにこのバッチを呼び出しても、call元のバッチに処理を戻せるような作りにしておきました。バッチファイル内でファイル(の情報を)比較をしたい場合にも使えるかもと思いました。