2015年1月31日土曜日

Windows標準コマンドでdiffする

Linuxなら迷うこと無くdiffコマンドがあるので問題ないが、Windowsの場合どうすれば良いか悩んでしまうことがある。フリーソフトがインストールできる環境ならまだしも、インターネットに繋がないサーバーとなると、OS標準のコマンドで実施する必要があるので調べてみた。

Windowsバッチファイル

実はコマンドがあってfc (File Compare)を使えば良い。オプションを確認してみよう。

C:\>fc /?
2 つのファイルまたはファイル セットを比較し、相違点を表示します。
FC [/A] [/C] [/L] [/LBn] [/N] [/OFF[LINE]] [/T] [/U] [/W] [/nnnn]
   [ドライブ1:][パス1]ファイル名1 [ドライブ2:][パス2]ファイル名2
FC /B [ドライブ1:][パス1]ファイル名1 [ドライブ2:][パス2]ファイル名2
 
  /A         相違する各部分の 1 行目と最後の行だけを表示します。
  /B         バイナリの比較を実行します。
  /C         英字の大文字と小文字を区別しません。
  /L         ファイルを ASCII テキストとして比較します。
  /LBn       連続する最大不一致行を指定行数に設定します。
  /N         ASCII の比較で行番号を表示します。
  /OFF[LINE] オフライン属性が設定されたファイルをスキップしません。
  /T         タブをスペースに変換しません。
  /U         Unicode テキスト ファイルとしてファイルを比較します。
  /W         連続した空白 (タブとスペース) を 1 つのスペースに圧縮して比較します。
  /nnnn      不一致発見後に確認する、一致すべき連続行数を指定します。
 
  [ドライブ1:][パス1]ファイル名1
             比較する最初のファイルまたはファイル セットを指定します。
  [ドライブ2:][パス2]ファイル名2
             比較する 2 番目のファイルまたはファイル セットを指定します。
見ての通りいろいろオプションはあるが、お勧めは/n付けて相違行番号を出すとわかりやすいと思う。
(実行例)
c:\>fc /n test.txt test2.txt
ファイル test.txt と TEST2.TXT を比較しています
***** test.txt
***** TEST2.TXT
    5:
    6:  hoge4
*****

PowerShell

Compare-Objectを使う。さらに標準でdiffとcompareでエイリアスに登録されているので、以下コマンドで実行することができる。

PowerShell的にはあくまでオブジェクトの比較になるので、一度cat(Get-Contentのエイリアス)でテキストを読み込ませてから比較する必要がある。SideIndicatorは=>となっていれば引数の右側、<=になっていれば引数の左側に差異があることを表している。
PS C:\> diff (cat '.\test.txt') (cat .\test2.txt)
 
InputObject                                                 SideIndicator
-----------                                                 -------------
                                                            =>
hoge4                                                       =>