it-swarm.asia

Windows Powershell'de iki metin dosyasını nasıl farklılaştırırım?

İki metin dosyam var ve Windows Powershell kullanarak aralarındaki farkları bulmak istiyorum. Unix fark aracına benzer bir şey var mı? Yoksa dikkate almadığım başka bir yol var mı?

Ben karşılaştırma nesnesi denedim, ama bu şifreli çıktı olsun:

PS C:\> compare-object one.txt two.txt

InputObject                                                 SideIndicator
-----------                                                 -------------
two.txt                                                     =>
one.txt                                                     <=
104
Brian Willis

Kendim anladım. Powershell, metin yerine .net nesneleriyle çalıştığı için, metin dosyalarının içeriğini göstermek için get-content kullanmanız gerekir. Yani soruda yapmaya çalıştığım şeyi gerçekleştirmek için şunu kullanın:

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

Bunu yapmanın daha basit bir yolu yazmaktır:

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

Veya DOS fc komutunu şu şekilde kullanabilirsiniz (Bu, her iki dosyanın çıktısını gösterir, böylece farklılıkları taramanız gerekir):

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

fc, Format-Custom cmdlet'inin takma adıdır, bu nedenle komutu fc.exe olarak girdiğinizden emin olun. Birçok DOS yardımcı programının UTF-8 kodlamasını işlemediğini lütfen unutmayın.

Ayrıca bir CMD işlemi oluşturabilir ve içinde fc çalıştırabilirsiniz.

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

Bu, PowerShell'e, tırnak içinde parametreleri kullanarak 'cmd' programıyla bir işlem başlatmasını bildirir. Tırnaklarda, komutu çalıştırmak ve sonlandırmak için '/ c' cmd seçeneği bulunur. İşlemde cmd tarafından çalıştırılacak gerçek komut, fc filea.txt fileb.txt Çıktıyı diff.txt Dosyasına yönlendiriyor.

DOS fc.exe 'U powershell içinden kullanabilirsiniz.

32
phord350

diff on * nix Shell'in bir parçası değil, ayrı bir uygulamadır.

PowerShell altında diff.exe'yi kullanamamanızın bir nedeni var mı?

UnxUtils paketinden bir sürüm indirebilirsiniz ( http://unxutils.sourceforge.net/ )

7
Mikeage

compare-object (aka diff alias), unix diff gibi davranmasını bekliyorsanız acınasıdır. Diff (gc dosya1) (gc dosya2) denedim ve bir çizgi çok uzunsa, gerçek farkı göremiyorum ve daha da önemlisi, farkın hangi satır numarasında olduğunu söyleyemem.

-Passthru eklemeyi denediğimde, şimdi farkı görebiliyorum, ancak farkın içinde bulunduğu dosyayı kaybediyorum ve hala bir satır numarası alamıyorum.

Benim tavsiyem, dosyalarda farklılıklar bulmak için powershell kullanmayın. Başka birinin belirttiği gibi, fc çalışır ve karşılaştırma nesnesinden biraz daha iyi çalışır ve daha da iyisi, Mikeage'ın bahsettiği unix emülatörü gibi gerçek araçları indirip kullanmaktır.

4
Marc Towersap

Diğerlerinin de belirttiği gibi, bir unix-y fark çıktısı bekliyorsanız, powershell fark takma adını kullanmak sizi zorlaştıracaktır. Bir kere, aslında dosyaları okumak için elini tutmalısınız (gc/get-content ile). Bir diğeri için, fark göstergesi sağda, içerikten uzak - bir okunabilirlik kabusu.

Aklı başında bir ürün arayan herkes için çözüm

  1. gerçek bir fark elde edin (örneğin GnuWin32'den)
  2. düzenleme% USERPROFILE%\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
  3. satırı ekle

    remove-item alias:diff -force
    

-Force argümanı gereklidir, çünkü Powershell bu özel dahili takma ad için oldukça değerlidir. Eğer ilgilenen varsa, GnuWin32 yüklü, ben de powershell profilime aşağıdakileri dahil:

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

Esas olarak Powershell birlikte çalıştırılan ve yazılan argümanları anlamadığından, örneğin "rm -Force -Recurse", "rm -rf" den çok daha fazla çaba gerektirir.

Powershell'in bazı güzel özellikleri var, ama benim için yapmaya çalışmaması gereken bazı şeyler var.

3
daf

WinMerge iyi bir GUI tabanlı fark aracıdır.

2
Andy White

fc.exe, * Nix diff gibi çalışacak şekilde tasarlandığından, metin karşılaştırması için daha iyidir, yani satırları sırayla karşılaştırır, gerçek farklılıkları gösterir ve yeniden senkronize etmeye çalışır (farklı bölümler farklı uzunluklara sahipse). Ayrıca bazı kullanışlı kontrol seçeneklerine (metin/ikili, büyük/küçük harf duyarlılığı, satır numaraları, yeniden senkronizasyon uzunluğu, uyumsuzluk arabellek boyutu) sahiptir ve çıkış durumu sağlar (-1 hatalı sözdizimi, 0 dosya aynı, 1 dosya farklı, 2 dosya eksik). (Çok) eski bir DOS yardımcı programı olarak, bazı sınırlamaları vardır. En önemlisi, Unicode ile otomatik olarak çalışmaz, ASCII karakterlerin 0 MSB'sini satır sonlandırıcı olarak ele alır, böylece dosya 1 karakterlik bir sıra haline gelir (@kennycoc:/U seçeneğini kullanın) BOTH dosyaları Unicode, WinXP ve üstüdür) ve ayrıca 128 karakterlik (128 bayt ASCII, 256 bayt Unicode) sabit satır arabellek boyutuna sahiptir, böylece uzun satırlar ayrı ayrı karşılaştırılır.

compar-object, 2 nesnenin üye açısından özdeş olup olmadığını belirlemek için tasarlanmıştır. nesneler koleksiyonsa, SETS (işlem karşılaştırma nesnesine bakın), yani kopyaları olmayan UNORDERED koleksiyonlar olarak ele alınırlar. 2 set, sipariş veya kopyalardan bağımsız olarak aynı üye öğelere sahipse eşittir. Bu, metin dosyalarını farklılıklar için karşılaştırmadaki kullanışlılığını ciddi şekilde sınırlar. İlk olarak, varsayılan davranış, tüm nesne (dosya = dizeler dizisi) kontrol edilene kadar farklılıkları toplar, böylece farklılıkların konumu ve hangi farklılıkların eşleştirildiğini (ve bir SET için satır numarası kavramı yoktur) belirsiz bilgileri kaybeder. dizeleri). -Synchwindow 0 kullanılması farkların ortaya çıktıkça yayılmasına neden olur, ancak bir dosyanın fazladan bir satırı varsa, dosyalar başka bir şekilde özdeş olsa bile (bir telafi edici olana kadar) sonraki satır karşılaştırmaları başarısız olabilir diğer dosyada fazladan bir satır varsa, böylece eşleşen satırları yeniden hizalar). Bununla birlikte, powershell son derece çok yönlüdür ve önemli karmaşıklık pahasına ve dosyaların içeriğinde bazı kısıtlamalar olsa da, bu işlevsellik kullanılarak yararlı bir dosya karşılaştırması yapılabilir. Metin dosyalarını uzun (> 127 karakter) satırlarla karşılaştırmanız ve satırların çoğunlukla 1: 1 ile eşleşmesi gerekiyorsa (dosyalar arasındaki satırlarda bazı değişiklikler olur, ancak anahtar alanı olan veritabanı kayıtlarının metin listesi gibi bir dosyada yineleme olmaz) daha sonra, her bir dosyaya hangi dosyanın olduğunu, o dosyadaki konumunu belirten bilgi ekleyerek ve karşılaştırma sırasında eklenen bilgileri yoksayarak (ancak çıktıya dahil ederek) aşağıdaki gibi bir * nix fark benzeri çıktı elde edebilirsiniz (takma ad kısaltmaları kullanılır) ):

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

burada xx en uzun çizginin uzunluğu + 9

Açıklama

  • (gc file | % -begin { $ln=0 } -process { '{0,6}<<:{1}' -f ++$ln,$_ }) Dosyanın içeriğini alır ve diff'e geçirmeden önce her satıra satır numarasını ve dosya göstergesini (<< veya >>) (format string operatörünü kullanarak) ekler.
  • -property { $_.substring(9) }, diff'e, ilk 9 karakteri (satır numarası ve dosya göstergesi olan) yok sayarak her bir nesne çiftini (dizeleri) karşılaştırmasını söyler. Bu, bir özellik adı yerine hesaplanmış bir özellik (komut dosyası bloğunun değeri) belirtme yeteneğini kullanır.
  • -passthru, Farkla karşılaştırılan farklı nesneler (farklı olmayan) yerine farklı girdi nesnelerini (satır numarasını ve dosya göstergesini içeren) çıktıya neden olur.
  • sort-object Daha sonra tüm satırları tekrar sıraya koyar.
    out-string, kesmeyi önlemek için yeterince büyük bir genişlik belirterek çıkışın varsayılan genişliğini ekran genişliğine sığacak şekilde durdurur (Marc Towersap tarafından belirtildiği gibi). Normalde, bu çıktı daha sonra bir kaydırma düzenleyicisi (örn. Not defteri) kullanılarak görüntülenen bir dosyaya yerleştirilir.

Not

Satır numarası biçimi {0,6} sağa yaslanmış, boşlukla doldurulmuş 6 karakterlik bir satır numarası verir (sıralama için). Dosyaların 999,999'dan fazla satırı varsa, formatı daha geniş olacak şekilde değiştirin. Bu ayrıca $_.substring Parametresinin (satır numarası genişliğinden 3 daha fazla) ve dize dışı xx değerinin (maksimum satır uzunluğu + $_.substring Parametresinin) değiştirilmesini gerektirir.

1
codemaster bob

Ayrıca bir GUI fark arayüzü sağlayan Windiff vardır (GUI tabanlı CVS/SVN programlarıyla kullanım için harika)

1
saschabeaumont