pengembangan-web-mp-pd.com

Bagaimana cara membedakan dua file teks di Windows Powershell?

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                                                     <=
104
Brian Willis

Mencari tahu sendiri. Karena Powershell bekerja dengan objek .net daripada teks, Anda harus menggunakan get-content untuk mengekspos konten file teks. Jadi untuk melakukan apa yang saya coba lakukan dalam pertanyaan, gunakan:

compare-object (get-content one.txt) (get-content two.txt)
110
Brian Willis

Cara yang lebih sederhana untuk melakukannya adalah dengan menulis:

diff (cat file1) (cat file2)
34
Alex Y.

Atau Anda dapat menggunakan perintah DOS fc seperti ini (Ini menunjukkan output dari kedua file sehingga Anda harus memindai perbedaannya):

fc.exe filea.txt fileb.txt > diff.txt

fc adalah alias untuk cmdlet Format-Kustom jadi pastikan untuk memasukkan perintah sebagai fc.exe. Harap dicatat bahwa banyak utilitas DOS tidak menangani pengkodean UTF-8.

Anda juga dapat menelurkan proses CMD dan menjalankan fc di dalamnya.

start cmd "/c  ""fc filea.txt fileb.txt >diff.txt"""

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 adalah fc filea.txt fileb.txt mengarahkan output ke file diff.txt.

Anda dapat menggunakan DOS fc.exe dari dalam PowerShell.

32
phord350

beda pada * nix bukan bagian dari Shell, tetapi aplikasi terpisah.

Apakah ada alasan Anda tidak bisa menggunakan diff.exe di bawah PowerShell?

Anda dapat mengunduh versi dari paket UnxUtils ( http://unxutils.sourceforge.net/ )

7
Mikeage

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.

4
Marc Towersap

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

  1. dapatkan perbedaan nyata (mis. dari GnuWin32)
  2. edit% USERPROFILE%\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
  3. tambahkan baris

    remove-item alias:diff -force
    

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:

remove-item alias:rm
remove-item alias:mv
remove-item alias:cp

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 yang bagus, tetapi ada beberapa hal yang seharusnya tidak dilakukan untuk saya.

3
daf

WinMerge adalah alat lain berbasis GUI yang bagus.

2
Andy White

fc.exe Lebih baik untuk membandingkan teks karena dirancang untuk bekerja seperti * nix diff, yaitu membandingkan garis secara berurutan, menunjukkan perbedaan yang sebenarnya dan mencoba menyinkronkan ulang (jika bagian yang berbeda memiliki panjang yang berbeda). Ini juga memiliki beberapa opsi kontrol yang berguna (teks/biner, sensitivitas kasus, 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 utilitas DOS (sangat) lama, ia memang memiliki beberapa keterbatasan. Terutama, itu tidak bekerja secara otomatis dengan Unicode, memperlakukan 0 MSB dari ASCII karakter sebagai terminator baris 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 (ASCII 128 byte, Unicode 256 byte) sehingga garis-garis yang panjang dapat dipisahkan dan dibandingkan secara terpisah.

objek banding dirancang untuk menentukan apakah 2 objek identik dengan anggota. jika objek adalah koleksi maka mereka diperlakukan sebagai SETS (lihat bantuan membandingkan-objek), mis. 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 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 berguna 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 yang panjang (> 127 karakter) dan di mana garis tersebut sebagian besar cocok dengan 1: 1 (beberapa perubahan dalam garis di antara file tetapi tidak ada duplikasi dalam file seperti daftar teks dari catatan basis data yang memiliki bidang kunci) kemudian dengan menambahkan informasi ke setiap baris yang menunjukkan di mana file itu berada, posisinya di dalam file itu dan kemudian mengabaikan informasi yang ditambahkan selama perbandingan (tetapi termasuk dalam output) Anda bisa mendapatkan output seperti * nix seperti berikut (alias singkatan yang digunakan ):

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 masukkan semua garis kembali ke dalam urutan.
    out-string menghentikan pemotongan default output agar sesuai dengan lebar layar (seperti yang 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 bergulir (mis. Notepad).

Catatan

Format nomor baris {0,6} memberikan angka garis 6 karakter yang dapat dibenarkan, diisi spasi (untuk penyortiran). Jika file memiliki lebih dari 999.999 baris maka cukup ubah format menjadi lebih luas. Ini juga membutuhkan pengubahan parameter $_.substring (3 lebih dari lebar nomor baris) dan nilai x-string keluar (panjang garis maksimum + parameter $_.substring).

1
codemaster bob

Ada juga Windiff yang menyediakan antarmuka GUI diff (bagus untuk digunakan dengan program CVS/SVN berbasis GUI)

1
saschabeaumont