FC(ファイルの比較)
設定ファイルを書き換えたあとに「どこを変更したのか」を確認したい、バックアップしたファイルと現在のファイルが同じか調べたい、といった場面はよくあります。
FC コマンドは、2つのファイルを比較して違いのある箇所を表示します。専用の差分ツールを入れなくても、コマンドプロンプトだけで手軽に確認できます。
基本的な使い方
FC コマンドには、比較したい2つのファイルを指定します。
FC [オプション] ファイル1 ファイル2
同じ内容の場合
ファイルの内容が同じ場合は、次のように表示されます。
違いがある場合
内容に違いがある場合は、***** で区切って、ファイルごとに違いのある部分が順に表示されます。

中小企業経営者のためのRPA入門 RPA導入を成功させる方法

60分でわかる! AIエージェント 超 入門

コマンドラインの黒い画面が怖いんです。

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門
上の例では、old.txt の mode=debug が new.txt では mode=release に変わっていることが分かります。違いのある行の前後にある、一致している行も数行ぶん一緒に表示されます。
メッセージの文言は、Windows の表示言語によって変わります。ここでは日本語環境の表示例を載せています。
PowerShell では fc が Format-Custom のエイリアスになっているため、この記事のコマンドは動作しません。PowerShell から使う場合は fc.exe と入力してください。
FC コマンドのオプション
よく使うオプションは次の通りです。
| オプション | 説明 |
|---|---|
/B | バイナリ(1バイトずつ)で比較する |
/C | 大文字と小文字を区別しない |
/N | テキスト比較時に行番号を表示する |
/W | 連続する空白やタブを1つの空白として扱い、行頭・行末の空白も無視して比較する |
/T | タブをスペースに展開しない |
/L | ファイルを ASCII テキストとして比較する |
/U | ファイルを Unicode(UTF-16)テキストとして比較する |
/A | 違いのある範囲の先頭行と末尾行だけを表示する |
/LBn | 連続して不一致となる行数の上限を指定する(既定は100行) |
/nnnn | 不一致のあと、何行連続して一致したら同期できたとみなすかを指定する(既定は2行) |
/C - 大文字と小文字を無視する
既定では大文字と小文字は区別されます。区別せずに比較したいときは /C を付けます。
/N - 行番号を表示する
どの行に違いがあるのかを知りたいときは /N を付けます。
行数の多いファイルでは、行番号があるとエディタで該当箇所へすぐ移動できます。不要であれば外してかまいません。
/W - 空白の違いを無視する
インデントの量や行内の空白の数だけが違うファイルは、既定では「違いがある」と判定されます。/W を付けると、連続する空白やタブが1つの空白として扱われ、行頭・行末の空白も無視されるため、こうした違いを無視できます。ただし、空白が「ある」か「ない」かの違いは無視されません。
/B - バイナリファイルを比較する
画像や実行ファイルなど、テキストではないファイルは /B を付けて1バイトずつ比較します。
各行は「先頭からの位置(16進数): ファイル1のバイト値 ファイル2のバイト値」を表します。上の例では、オフセット 0x42 と 0x43 の位置のバイトが異なっています(オフセットは 0 始まりです)。ファイルの長さが異なる場合は、その旨のメッセージが表示され、終了コードも「違いあり」になります。
.exe、.com、.sys、.obj、.lib、.bin の拡張子のファイルは、/B を付けなくてもバイナリで比較されます。それ以外のファイルは /L(ASCII テキスト比較)で比較されます。
/U - Unicode(UTF-16)のテキストを比較する
UTF-16 で保存されたテキストファイルは、既定の ASCII 比較では差分の表示が文字化けします。その場合は /U を付けます。
文字コードの異なるファイル同士(たとえば UTF-8 と Shift_JIS)を比較すると、内容が同じ文章でも「違いあり」と判定されます。比較の前に、文字コードを揃えておいてください。文字コードについては関連記事も参照してください。
ワイルドカードで複数ファイルを比較する
ファイル名には * や ? といったワイルドカードを使えます。たとえば、2つのフォルダにある同名のテキストファイルをまとめて比較できます。
FC は指定したフォルダ直下のファイルだけを比較します。サブフォルダを含めたフォルダ全体の比較には、PowerShell の Compare-Object に Get-ChildItem と Get-FileHash を組み合わせる方法があります。なお、robocopy の /L(コピーせず一覧のみ表示)はサイズと更新日時から新規・更新・不足ファイルを確認するもので、内容そのものは比較しません。
終了コードで一致を判定する
FC は比較結果を終了コード(ERRORLEVEL)で返します。バッチファイルで「同じ内容かどうか」を判断するときに使えます。
| 終了コード | 意味 |
|---|---|
0 | 2つのファイルは同じ |
1 | 2つのファイルに違いがある |
2 | 比較するファイルの一方が見つからない |
-1 | 構文が正しくない |
@echo off
fc /B "%~1" "%~2" >nul
if %errorlevel%==0 (
echo 同じファイルです。
) else if %errorlevel%==1 (
echo 違いがあります。
) else (
echo ファイルが見つからないか、指定が正しくありません。
)
判定だけを行いたいので、比較結果の表示は >nul で捨てています。このバッチファイルは日本語を表示するため、Shift_JIS(ANSI)で保存してください。UTF-8 で保存すると文字化けします。
if errorlevel 1 は「終了コードが 1 以上」のときに真になるため、ファイルが見つからなかった場合(終了コード 2)も含まれてしまい、逆に -1 は偽になります。ここでは %errorlevel%==0 のように値を直接比較しています。
比較結果をファイルに保存する
差分をレポートとして残したいときは、リダイレクトでファイルに保存します。
実践例
設定ファイルの変更箇所を確認する
編集前にコピーしておいたファイルと比較すれば、変更箇所を確認できます。
編集後に次のコマンドで差分を確認します。
コピーが正しくできたか確認する
大きなファイルをコピーしたあと、元のファイルと同じ内容かを確認できます。ただし、サイズの大きなファイルでは時間がかかります。
まとめ
| やりたいこと | コマンド |
|---|---|
| 2つのファイルを比較する | fc ファイル1 ファイル2 |
| 大文字小文字を無視する | fc /C ファイル1 ファイル2 |
| 行番号を表示する | fc /N ファイル1 ファイル2 |
| 空白の違いを無視する | fc /W ファイル1 ファイル2 |
| バイナリで比較する | fc /B ファイル1 ファイル2 |
| 一致を判定する | fc ... >nul と %errorlevel% |