fc.exe
краще для порівняння тексту, оскільки він призначений для роботи як * nix diff, тобто порівнює рядки послідовно, показуючи фактичні відмінності та намагаючись повторно синхронізувати (якщо різні розділи мають різну довжину). Він також має деякі корисні параметри керування (текст / двійковий, чутливість регістру, номери рядків, довжина ресинхронізації, розмір буфера невідповідності) та забезпечує статус виходу (-1 поганий синтаксис, 0 файлів однаково, 1 файл відрізняється, 2 файли відсутні). Будучи (дуже) старою утилітою DOS, у неї є кілька обмежень. Найголовніше, що він не працює автоматично з Unicode, трактуючи 0 MSB символів ASCII як термінатор рядка, тому файл стає послідовністю з 1 символьного рядка (@kennycoc: використовуйте параметр / U для визначення файлів BOTH Unicode, WinXP і далі ) і він також має буфер жорсткої лінії розміром 128 символів (128 байт ASCII,
Порівняння-об'єкт призначений для визначення того, чи є 2 об'єкти однаковими для членів. якщо об'єкти є колекціями, то вони трактуються як SETS (див. довідку порівняння-об’єкта), тобто колекції UNORDERED без дублікатів. 2 набори рівні, якщо вони мають однакові елементи членів, незалежно від порядку чи дублювання. Це суттєво обмежує його корисність для порівняння текстових файлів для відмінностей. По-перше, поведінка за замовчуванням збирає відмінності до тих пір, поки весь об'єкт (файл = масив рядків) не перевіряється, таким чином втрачаючи інформацію про положення різниць і затушовуючи, які відмінності поєднуються (і немає поняття номер рядка для SET струн). Використання -synchwindow 0 призведе до того, що різниці видаватимуться у міру їх виникнення, але перешкоджає спробі повторної синхронізації, тому якщо один файл має додатковий рядок, то наступні порівняння рядків можуть вийти з ладу, навіть якщо файли інакше однакові (доки не буде компенсації зайвий рядок в іншому файлі, тим самим переставляючи відповідні лінії). Однак повноваження вкрай універсальні, і корисне порівняння файлів можна здійснити, використовуючи цю функціональність, хоча і ціною значної складності та з деякими обмеженнями щодо вмісту файлів. Якщо вам потрібно порівняти текстові файли з довгими (> 127 символами) рядками та де рядки здебільшого відповідають 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
де xx - довжина найдовшої лінії + 9
Пояснення
(gc file | % -begin { $ln=0 } -process { '{0,6}<<:{1}' -f ++$ln,$_ })
отримує вміст файлу і попередньо додає номер рядка та індикатор файлу (<< або >>) до кожного рядка (використовуючи оператор рядка формату) перед тим, як передати його до розл.
-property { $_.substring(9) }
каже diff для порівняння кожної пари об'єктів (рядків), ігноруючи перші 9 символів (це номер рядка та показник файлу). При цьому використовується можливість вказувати обчислену властивість (значення блоку сценарію) замість імені властивості.
-passthru
викликає diff для виведення різних вхідних об'єктів (які включають номер рядка та індикатор файлу) замість різних об'єктів, що порівнюються (які не мають).
sort-object
потім повертає всі рядки в послідовність.
out-string зупиняє усічення виводу за замовчуванням, щоб відповідати ширині екрану (як зазначив Марк Товерсап), вказавши достатньо велику ширину, щоб уникнути усікання. Зазвичай цей вихід буде розміщений у файлі, який потім переглядається за допомогою редактора прокрутки (наприклад, блокнот).
Примітка
Формат номера рядка {0,6} дає право виправданий пробіл із 6 символами (для сортування). Якщо у файлах більше 999 999 рядків, просто змініть формат, щоб бути ширшим. Для цього також потрібно змінити $_.substring
параметр (на 3 більше, ніж ширина номера рядка) та значення xx вихідного рядка (максимальна довжина рядка + $_.substring
параметр).