Saya memiliki dua file teks dan ingin menemukan perbedaan di antara mereka menggunakan Windows Powershell. Apakah ada sesuatu yang mirip dengan alat Unix diff yang tersedia? Atau ada cara lain yang belum saya pertimbangkan?
Saya sudah mencoba objek perbandingan, tetapi dapatkan output samar ini:
PS C:\> compare-object one.txt two.txt
InputObject SideIndicator
----------- -------------
two.txt =>
one.txt <=
windows
powershell
Brian Willis
sumber
sumber
-SyncWindow 0
untuk memperbaikinya, saya percaya, meskipun saya tidak yakin apakah itu baru saja diperkenalkan. Tapi itu tidak terlalu pintar tentang itu.Cara yang lebih sederhana untuk melakukannya adalah dengan menulis:
sumber
diff
sama sekali, seperti jawaban lain di sini perhatikan. Dan ketika saya menggunakan ekspresi yang lebih kompleks di tempatcat
saya mendapat output yang salah, jadi saya akan bergabung dengan yang lain dalam rekomendasi untuk menghindari melakukan ini di PowerShell jika Anda berasal dari * nix.Atau Anda bisa menggunakan
fc
perintah DOS seperti ini (Ini menunjukkan output dari kedua file sehingga Anda harus memindai perbedaannya):fc
adalah alias untuk cmdlet Format-Kustom jadi pastikan untuk memasukkan perintah sebagaifc.exe
. Harap dicatat bahwa banyak utilitas DOS tidak menangani pengkodean UTF-8.Anda juga dapat menelurkan proses CMD dan menjalankannya
fc
.Ini menginstruksikan PowerShell untuk memulai proses dengan program 'cmd' menggunakan parameter dalam tanda kutip. Dalam tanda kutip, adalah opsi '/ c' cmd untuk menjalankan perintah dan mengakhiri. Perintah aktual untuk dijalankan oleh cmd dalam proses ini adalah
fc filea.txt fileb.txt
mengarahkan kembali output ke filediff.txt
.Anda dapat menggunakan DOS
fc.exe
dari dalam PowerShell.sumber
diff pada * nix bukan bagian dari shell, tetapi aplikasi yang terpisah.
Apakah ada alasan Anda tidak bisa menggunakan diff.exe di bawah PowerShell?
Anda dapat mengunduh versi dari paket UnxUtils ( http://unxutils.sourceforge.net/ )
sumber
git diff
, karena saya sudah menginstalnya. Tidakfc.exe
jugaCompare-Object
menghasilkan output yang saya harapkan.objek-banding (alias diff alias) menyedihkan jika Anda mengharapkannya berperilaku seperti diff unix. Saya mencoba diff (gc file1) (gc file2), dan jika sebuah baris terlalu panjang, saya tidak dapat melihat diff yang sebenarnya dan yang lebih penting, saya tidak bisa mengatakan nomor baris mana diff tersebut aktif.
Ketika saya mencoba menambahkan -passthru, saya sekarang dapat melihat perbedaannya, tetapi saya kehilangan file mana perbedaannya, dan saya masih tidak mendapatkan nomor baris.
Saran saya, jangan gunakan PowerShell untuk menemukan perbedaan dalam file. Seperti orang lain catat, fc bekerja, dan bekerja sedikit lebih baik daripada membandingkan-objek, dan bahkan lebih baik mengunduh dan menggunakan alat nyata seperti emulator unix yang disebutkan Mikeage.
sumber
-SyncWindow
yang maksint secara default. Menetapkan bahwa ke 0 tidak membuatnya bekerja sepertidiff
... Dan ketika saya melewati sebuah pipa(... | select-object ...)
sebagai input, itu hanya mencetak omong kosong, jadi saya menyerah.Seperti yang telah dicatat orang lain, jika Anda mengharapkan output unix-y diff, menggunakan powershell diff alias akan mengecewakan Anda. Untuk satu hal, Anda harus memegang tangannya untuk benar-benar membaca file (dengan gc / get-content). Untuk yang lain, indikator perbedaannya ada di kanan, jauh dari konten - itu adalah mimpi buruk keterbacaan.
Solusi bagi siapa pun yang mencari output yang waras adalah
tambahkan baris
Argumen -force diperlukan karena Powershell sangat berharga tentang alias inbuilt khusus ini. Jika ada yang tertarik, setelah menginstal GnuWin32, saya juga memasukkan yang berikut ini di profil PowerShell saya:
Terutama karena Powershell tidak memahami argumen yang dijalankan bersama dan mengetik, misalnya "rm -Force -Recurse" adalah upaya yang jauh lebih banyak daripada "rm -rf".
Powershell memiliki beberapa fitur bagus, tetapi ada beberapa hal yang seharusnya tidak dilakukan untuk saya.
sumber
WinMerge adalah alat diff berbasis GUI yang bagus.
sumber
Ada juga Windiff yang menyediakan antarmuka GUI (bagus untuk digunakan dengan program CVS / SVN berbasis GUI)
sumber
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:
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 ).sumber