fc.exe
* nix diffのように動作するように設計されているため、テキスト比較に適しています。つまり、行を順次比較し、実際の違いを示し、再同期を試みます(異なるセクションの長さが異なる場合)。また、いくつかの便利な制御オプション(テキスト/バイナリ、大文字と小文字の区別、行番号、再同期の長さ、バッファーサイズの不一致)があり、終了ステータス(-1不正な構文、0ファイルが同じ、1ファイルが異なる、2ファイルが欠落)を提供します。(非常に)古いDOSユーティリティであるため、いくつかの制限があります。最も顕著なのは、Unicodeで自動的に動作せず、ASCII文字の0 MSBを行終端文字として扱うため、ファイルは1文字行のシーケンスになります(@kennycoc:/ Uオプションを使用して、両方のファイルがUnicode、WinXP以降を指定する)また、128文字(128バイトASCII、
compare-objectは、2つのオブジェクトがメンバーごとに同一であるかどうかを判断するように設計されています。オブジェクトがコレクションの場合、それらはSETS(help compare-objectを参照)、つまり重複のないUNORDEREDコレクションとして扱われます。2つのセットは、順序または複製に関係なく同じメンバーアイテムを持っている場合、等しくなります。これにより、テキストファイルの違いを比較する際の有用性が大幅に制限されます。まず、デフォルトの動作では、オブジェクト全体(ファイル=文字列の配列)がチェックされるまで違いが収集されるため、違いの位置に関する情報が失われ、どの違いがペアになっているかがわかりにくくなります(SETの行番号の概念はありません)文字列の)。-synchwindow 0を使用すると、差異が発生すると出力されますが、1つのファイルに余分な行がある場合、ファイルが同じ場合でも後続の行比較が失敗する可能性があります(補償があるまで)他のファイルの余分な行により、一致する行が再配置されます)。ただし、powershellは非常に汎用性が高く、この機能を利用することで、ファイルの内容にある程度の制限がありますが、かなり複雑になりますが、便利なファイル比較を行うことができます。テキストファイルを長い(127文字を超える)行で比較する必要があり、行がほとんど一致する場合:
diff (gc file1 | % -begin { $ln1=0 } -process { '{0,6}<<:{1}' -f ++$ln1,$_ }) (gc file2 | % -begin { $ln2=0 } -process { '{0,6}>>:{1}' -f ++$ln2,$_ }) -property { $_.substring(9) } -passthru | sort | out-string -width xx
ここで、xxは最も長い行の長さ+ 9
説明
(gc file | % -begin { $ln=0 } -process { '{0,6}<<:{1}' -f ++$ln,$_ })
ファイルの内容を取得し、行番号とファイルインジケータ(<<または>>)を各行に追加してから(書式文字列演算子を使用)、diffに渡します。
-property { $_.substring(9) }
最初の9文字(行番号とファイルインジケータ)を無視して、オブジェクト(文字列)の各ペアを比較するようにdiffに指示します。これは、プロパティの名前の代わりに計算されたプロパティ(スクリプトブロックの値)を指定する機能を利用します。
-passthru
diffは、異なる比較オブジェクト(出力しない)の代わりに、異なる入力オブジェクト(行番号とファイルインジケーターを含む)を出力します。
sort-object
次に、すべての行をシーケンスに戻します。
out-stringは、切り捨てを避けるのに十分な幅を指定することにより、出力のデフォルトの切り捨てを停止して(Marc Towersapが指摘した)画面幅に合わせます。通常、この出力はファイルに書き込まれ、スクロールエディター(メモ帳など)を使用して表示されます。
注意
行番号の形式{0,6}は、右詰めでスペースが埋め込まれた6文字の行番号(ソート用)を提供します。ファイルの行数が999,999を超える場合は、フォーマットを変更して幅を広げます。これには、$_.substring
パラメーター(行番号の幅よりも3大きい)およびストリング外xx値(最大行長+ $_.substring
パラメーター)の変更も必要です。