fc.exe
lebih baik untuk membandingkan teks karena dirancang untuk bekerja seperti * nix diff, yaitu membandingkan baris secara berurutan, menunjukkan perbedaan aktual dan mencoba menyinkronkan ulang (jika bagian yang berbeda memiliki panjang yang berbeda). Ini juga memiliki beberapa opsi kontrol yang berguna (teks / biner, sensitivitas case, nomor baris, panjang sinkronisasi ulang, ukuran buffer tidak cocok) dan memberikan status keluar (-1 sintaks buruk, 0 file sama, 1 file berbeda, 2 file hilang). Menjadi (sangat) utilitas DOS lama, itu memang memiliki beberapa keterbatasan. Terutama, itu tidak otomatis bekerja dengan Unicode, memperlakukan 0 MSB karakter ASCII sebagai terminator garis sehingga file menjadi urutan 1 baris karakter (@kennycoc: gunakan opsi / U untuk menentukan KEDUA file adalah Unicode, WinXP dan seterusnya ) dan juga memiliki ukuran buffer garis keras 128 karakter (128 byte ASCII,
objek banding dirancang untuk menentukan apakah 2 objek identik dengan anggota. jika objek adalah koleksi maka mereka diperlakukan sebagai SETS (lihat bantuan membandingkan-objek), yaitu koleksi UNORDERED tanpa duplikat. 2 set sama jika mereka memiliki item anggota yang sama terlepas dari pesanan atau duplikasi. Ini sangat membatasi kegunaannya untuk membandingkan file teks untuk perbedaan. Pertama, perilaku default mengumpulkan perbedaan sampai seluruh objek (file = array string) telah diperiksa sehingga kehilangan informasi mengenai posisi perbedaan dan mengaburkan perbedaan mana yang dipasangkan (dan tidak ada konsep nomor baris untuk SET) string). Menggunakan -synchwindow 0 akan menyebabkan perbedaan yang dipancarkan ketika terjadi tetapi menghentikannya dari mencoba menyinkronkan kembali sehingga jika satu file memiliki baris tambahan maka perbandingan baris berikutnya dapat gagal meskipun file tersebut identik (sampai ada kompensasi baris tambahan di file lain dengan demikian menyelaraskan garis yang cocok). Namun, PowerShell sangat fleksibel dan membandingkan file yang bermanfaat dapat dilakukan dengan memanfaatkan fungsi ini, meskipun dengan biaya kompleksitas yang substansial dan dengan beberapa pembatasan pada konten file. Jika Anda perlu membandingkan file teks dengan garis panjang (> 127 karakter) dan di mana garis tersebut paling cocok dengan 1:
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
di mana xx adalah panjang dari garis terpanjang + 9
Penjelasan
(gc file | % -begin { $ln=0 } -process { '{0,6}<<:{1}' -f ++$ln,$_ })
mendapatkan konten file dan menambahkan nomor baris dan indikator file (<< atau >>) ke setiap baris (menggunakan operator format string) sebelum meneruskannya ke diff.
-property { $_.substring(9) }
memberitahu diff untuk membandingkan setiap pasangan objek (string) dengan mengabaikan 9 karakter pertama (yang merupakan nomor baris dan indikator file). Ini memanfaatkan kemampuan untuk menentukan properti yang dihitung (nilai blok skrip) alih-alih nama properti.
-passthru
menyebabkan diff untuk menampilkan objek input yang berbeda (yang mencakup nomor baris dan indikator file) alih-alih objek yang dibandingkan berbeda (yang tidak).
sort-object
lalu letakkan semua garis kembali ke dalam urutan.
keluar-string menghentikan pemotongan default output agar sesuai dengan lebar layar (seperti dicatat oleh Marc Towersap) dengan menentukan lebar yang cukup besar untuk menghindari pemotongan. Biasanya, output ini akan dimasukkan ke dalam file yang kemudian dilihat menggunakan editor gulir (misalnya notepad).
Catatan
Format nomor baris {0,6} memberikan angka garis 6 karakter yang dapat dibenarkan, dengan spasi tepat (untuk pengurutan). Jika file memiliki lebih dari 999.999 baris maka cukup ubah format menjadi lebih luas. Ini juga membutuhkan pengubahan $_.substring
parameter (3 lebih dari lebar nomor baris) dan nilai x-string-out (panjang + $_.substring
parameter maksimum ).