fc.exe
* nix diff gibi çalışmak üzere tasarlandığından metin karşılaştırması için daha iyidir, yani satırları sıralı olarak karşılaştırır, gerçek farklılıkları gösterir ve yeniden senkronize etmeye çalışır (eğer farklı bölümler farklı uzunluklarda ise). Ayrıca bazı yararlı 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ı olduğundan, birkaç sınırlaması vardır. En önemlisi, otomatik olarak Unicode ile çalışmaz, ASCII 0 MSB karakterini bir satır sonlandırıcı olarak kabul eder, böylece dosya 1 karakter satırlık bir sıra haline gelir (@kennycoc: BOTH dosyalarının Unicode, WinXP kullanılacağını belirtmek için / U seçeneğini kullanın) ) ayrıca 128 karakterlik (128 bayt ASCII,)
compare-object, 2 nesnenin üye olarak aynı olup olmadığını belirlemek için tasarlanmıştır. nesneler koleksiyon ise o zaman SETS (işlem karşılaştırması-nesnesine bakınız), yani yinelenmemiş UNORDERED koleksiyonlar olarak kabul edilir. Sipariş veya kopyalardan bağımsız olarak aynı üye öğelerine sahiplerse 2 takım eşittir. Bu, metin dosyalarının farklılıklarla karşılaştırılmasında yararını ciddi şekilde sınırlandırır. İlk olarak, varsayılan davranış tüm nesnenin (dosya = dizelerin dizisi) tamamı kontrol edilinceye kadar farkları toplar, böylece farkların konumu ile ilgili bilgileri kaybeder ve hangi farkların eşleştirildiğini belirlemez (ve bir SET için satır numarası kavramı yoktur) dizeleri -Synchwindow 0 kullanmak, farklılıkların ortaya çıktıkça yayılmasına neden olur, ancak bir dosyanın fazladan bir satırı varsa, ardından başka bir satır aynıysa bile sonraki satır karşılaştırmaları başarısız olabilir (bir telafi edici oluncaya kadar) diğer dosyadaki fazladan satır, böylece eşleşen satırları yeniden hizalar). Bununla birlikte, powershell son derece çok yönlüdür ve bu işlevselliği kullanarak, önemli karmaşıklık pahasına ve dosyaların içeriğinde bazı kısıtlamalar olsa da yararlı bir dosya karşılaştırması yapılabilir. Metin dosyalarını uzun (> 127 karakter) satırlarla ve satırların çoğunlukla 1 ile eşleştiği yerde karşılaştırmanız gerekirse:
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 en uzun satırın uzunluğu + 9
açıklama
(gc file | % -begin { $ln=0 } -process { '{0,6}<<:{1}' -f ++$ln,$_ })
Dosyanın içeriğini alır ve difere geçirmeden önce satır numarasını ve dosya göstergesini (<< veya >>) her satıra (format string operatörünü kullanarak) hazırlar.
-property { $_.substring(9) }
diff'e, ilk 9 karakteri görmezden gelen (satır numarası ve dosya göstergesi olan) her nesne çiftini karşılaştırmasını söyler. Bu, bir özellik adı yerine hesaplanmış bir özellik (bir komut dosyası bloğunun değeri) belirtme özelliğini kullanır.
-passthru
farklı karşılaştırılan nesneler yerine (farklı olan) giriş nesnelerinin (satır numarasını ve dosya göstergesini içeren) çıkarmasına neden olur.
sort-object
sonra tüm satırları tekrar sıraya sokar.
out-string, kesilmeyi önleyecek kadar büyük bir genişlik belirleyerek ekran genişliğine (Marc Towersap tarafından belirtildiği gibi) uyacak şekilde varsayılan kesmeyi durdurur. Normalde, bu çıktı daha sonra bir kaydırma editörü (örneğin not defteri) kullanılarak görüntülenen bir dosyaya yerleştirilir.
Not
{0,6} satır numarası, haklı, boşlukla doldurulmuş 6 karakterli satır numarasını (sıralama için) verir. Dosyaların 999.999'dan fazla satırı varsa, daha geniş olacak şekilde formatını değiştirin. Bu aynı zamanda $_.substring
parametrenin (satır numarası genişliğinden 3 daha fazla) ve out-xx değerinin (maksimum satır uzunluğu + $_.substring
parametre) değiştirilmesini gerektirir.