はじめに
Windows環境でテキストファイルを比較する時、普段はWinMergeを使って比較していますが、今回はコマンドを使って比較する方法を調べてみました。
比較するファイル
- 以下の
a.txtとb.txtを比較対象とします。
a.txt
abcdefghijklmnopqrstuvwxyz
0123456789
abcdefghijklmnopqrstuvwxyz
0123456789
b.txt
abcdefghijklmnopqrstuvwxyz
0123456789
0123456789
0123456789
Compare-Objectコマンドレット
-
Compare-Objectコマンドレットを使う場合、比較するテキストファイルのパスをハッシュテーブル(連想配列)にセットする必要があります。- Linuxの
diffコマンドと比べると、ちょっと面倒な書き方だと感じました。
- Linuxの
Compare-Objectの利用
$objects = @{
ReferenceObject = (Get-Content -Path C:\Users\NKOJIMA\Desktop\test\a.txt)
DifferenceObject = (Get-Content -Path C:\Users\NKOJIMA\Desktop\test\b.txt)
}
Compare-Object @objects
- 実行結果は以下のよう差分だけが表示されますが、ファイルの何行目に差分があるのかは分かりません。
実行結果
InputObject SideIndicator
----------- -------------
0123456789 =>
abcdefghijklmnopqrstuvwxyz <=
fcコマンド
-
fcコマンドは、コマンドプロンプトの時代から使えるコマンドとして知られています。 - 基本的な構文は
fc {比較するファイル1} {比較するファイル}で、Linuxのdiffコマンドと同じなので覚えやすいと思います。
コマンドプロンプトで実行する場合
コマンドプロンプトで実行する場合
fc C:\Users\NKOJIMA\Desktop\test\a.txt C:\Users\NKOJIMA\Desktop\test\b.txt
- 実行結果は、差分の前後の行も出力されるのでかなり見づらいです。
実行結果
ファイル C:\USERS\NKOJIMA\DESKTOP\TEST\a.txt と C:\USERS\NKOJIMA\DESKTOP\TEST\B.TXT を比較しています
***** C:\USERS\NKOJIMA\DESKTOP\TEST\a.txt
0123456789
abcdefghijklmnopqrstuvwxyz
0123456789
***** C:\USERS\NKOJIMA\DESKTOP\TEST\B.TXT
0123456789
0123456789
*****
***** C:\USERS\NKOJIMA\DESKTOP\TEST\a.txt
***** C:\USERS\NKOJIMA\DESKTOP\TEST\B.TXT
0123456789
*****
- また、上記のオプション無しの実行結果だとファイルの何行目に差分があるのかは分かりませんが、
/nパラメーターを付ければ以下のように行番号を出力できます。
実行結果(行番号を付けた場合)
ファイル C:\USERS\NKOJIMA\DESKTOP\TEST\a.txt と C:\USERS\NKOJIMA\DESKTOP\TEST\B.TXT を比較しています
***** C:\USERS\NKOJIMA\DESKTOP\TEST\a.txt
2: 0123456789
3: abcdefghijklmnopqrstuvwxyz
4: 0123456789
***** C:\USERS\NKOJIMA\DESKTOP\TEST\B.TXT
2: 0123456789
3: 0123456789
*****
***** C:\USERS\NKOJIMA\DESKTOP\TEST\a.txt
***** C:\USERS\NKOJIMA\DESKTOP\TEST\B.TXT
4: 0123456789
*****
PowerShellで実行する場合
- コマンドプロンプトでの実行時と同様に
fcと指定するだけだと、「{ファイル名}を受け入れる位置指定パラメーターが見つかりません」というエラーが発生します。
PowerShellでの誤った実行例
fc C:\Users\NKOJIMA\Desktop\test\a.txt C:\Users\NKOJIMA\Desktop\test\b.txt
実行結果(誤った実行例)
Format-Custom : 引数 'C:\Users\NKOJIMA\Desktop\test\b.txt' を受け入れる位置指定パラメーターが見つかりません。
発生場所 行:1 文字:1
+ fc C:\Users\NKOJIMA\Desktop\test\a.txt C:\Users\NKOJIMA\Desktop\test\ ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Format-Custom]、ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.FormatCustomCommand
- 上記のエラーを回避するには、
fc.exeと書いてfcコマンドを実行します。 - なぜこのようなエラーが発生するのか調べてみたところ、PowerShell上では
fcはFormat-Customコマンドレットのエイリアスとして登録されており、単にfcと書くだけだとFormat-Customコマンドレットが呼び出されることが原因のようです。
PowerShellでの正しい実行例
fc.exe C:\Users\NKOJIMA\Desktop\test\a.txt
実行結果(正しい実行例)
C:\Users\NKOJIMA\Desktop\test\b.txt
ファイル C:\USERS\NKOJIMA\DESKTOP\TEST\a.txt と C:\USERS\NKOJIMA\DESKTOP\TEST\B.TXT を比較しています
***** C:\USERS\NKOJIMA\DESKTOP\TEST\a.txt
0123456789
abcdefghijklmnopqrstuvwxyz
0123456789
***** C:\USERS\NKOJIMA\DESKTOP\TEST\B.TXT
0123456789
0123456789
*****
***** C:\USERS\NKOJIMA\DESKTOP\TEST\a.txt
***** C:\USERS\NKOJIMA\DESKTOP\TEST\B.TXT
0123456789
*****