Як порівняти два текстові файли в PowerShell або CMD

Останнє оновлення: 12/12/2025
Автор: Ісаак
  • Порівняння об'єктів у PowerShell Це дозволяє порівнювати файли та колекції об'єктів, виділяючи відмінності та подібності з SideIndicator.
  • Такі параметри, як -IncludeEqual, -ExcludeDifferent, -Property або -PassThru, контролюють, що порівнюється та як відображається результат.
  • Команда fc.exe програми КМД Він пропонує порівняння в текстовому або двійковому режимі з опціями ігнорування великих літер, пробілів або роботи з Unicode.
  • Поєднання цих інструментів зі скриптами, HTML та електронною поштою дозволяє автоматизувати звіти та виявляти зміни в даних, таких як списки МАК або процеси.

Порівняння текстів у PowerShell або CMD

Коли вам потрібно порівняти два тексти або файли, щоб знайти відмінності , робити це на око — це шлях до втрати часу та, до того ж, до помилок. Якщо ви працюєте зі скриптами, конфігураціями, журналами або списками пристроїв, наявність консольного інструменту, який підкреслює зміни від однієї версії до іншої, є безцінним.

У Windows найпрактичнішим підходом є використання PowerShell та командного рядка (CMD) , які попередньо встановлені. За їх допомогою ви можете порівнювати два файли, два набори даних або навіть результати в пам'яті та одразу бачити, що нового, що зникло, а що залишилося незмінним. Давайте детальніше розглянемо, як отримати максимальну віддачу від команди Compare-Object PowerShell та fc.exe CMD , а також наведемо реальні приклади та кілька додаткових порад і хитрощів.

Порівняння текстів за допомогою PowerShell за допомогою Compare-Object

Compare-Object – це стандартний командлет PowerShell для порівняння двох наборів об'єктів. У найпростішому випадку ви будете використовувати його для перегляду відмінностей між вмістом двох текстових файлів, але насправді він працює з будь-яким типом об'єктів: процесами, діапазонами часу, логічними значеннями, даними CSV, результатами скриптів тощо.

Основна ідея дуже проста: ви вказуєте ReferenceObject (те, що ви використовуєте як посилання) та DifferenceObject (те, що ви хочете порівняти з посиланням). Командлет аналізує обидва набори та повертає, які елементи з'являються лише в одному, лише в іншому або в обох.

Загальний синтаксис за замовчуванням для Compare-Object такий:

Compare-Object <PSObject[]> <PSObject[]> >]

За звичайних обставин, Compare-Object намагається використовувати методи порівняння, специфічні для типу об'єкта. Якщо він не може їх знайти, він використовує метод ToString() кожного вхідного значення та порівнює результуючі рядки. Крім того, ви можете вказати одну або кілька властивостей за допомогою параметра -Property , щоб порівнювати лише ці конкретні поля.

Результат завжди містить ключову властивість під назвою SideIndicator , яка позначає, звідки походить кожне значення: чи воно знаходиться лише в об'єкті-посиланні, чи воно знаходиться лише в об'єкті-різниці, чи воно знаходиться в обох, коли ви запитуєте відображення значень рівності.

Якщо ви випадково передасте $null до ReferenceObject або DifferenceObject , командлет викличе помилку завершення, тому перед порівнянням рекомендується переконатися, що обидва набори містять дані.

Порівняння об'єктів у PowerShell

Практичні приклади з Compare-Object

Щоб повністю зрозуміти, як працює Compare-Object, немає нічого кращого, ніж розглянути низку типових прикладів, від порівняння текстових файлів до порівняння складних об'єктів або використання параметрів, таких як -IncludeEqual , -ExcludeDifferent або -PassThru.

Приклад 1: Порівняння вмісту двох текстових файлів

У цьому сценарії у вас є два текстові файли, кожен зі списком слів на окремих рядках . Compare-Object дозволяє швидко побачити, які елементи існують лише в одному файлі, а не в іншому.

Припустимо, що це такі файли:

  • Testfile1.txtсобака, білка, птах
  • Testfile2.txt: кіт, птах, єнот

Типове використання Compare-Object буде таким:

$objects = @{
ReferenceObject = Get-Content -Path C:\Test\Testfile1.txt
DifferenceObject = Get-Content -Path C:\Test\Testfile2.txt
}
Compare-Object @objects

Вивід виглядатиме так, де InputObject відображає порівнюване значення , а SideIndicator вказує, на якому боці воно знаходиться:

InputObject  SideIndicator
-----------  -------------
cat        =>
racoon     =>
dog        <=
squirrel   <=

У цьому контексті "=>" означає, що значення знаходиться лише в DifferenceObject (у цьому випадку, у вмісті Testfile2), тоді як "<=" вказує, що воно знаходиться лише в ReferenceObject (Testfile1).

Приклад 2: Показати лише спільні лінії та виключити відмінності

Можливо, вам не потрібно виявляти, що змінилося, а скоріше потрібно знайти, які рядки ідентичні між двома файлами . Для цього використовується комбінація параметрів -ExcludeDifferent та -IncludeEqual , хоча, починаючи з PowerShell 7.1, вказівка ​​ExcludeDifferent автоматично передбачає IncludeEqual.

Прикладом, щоб побачити лише спільні лінії, буде:

$objects = @{
ReferenceObject = Get-Content -Path C:\Test\Testfile1.txt
DifferenceObject = Get-Content -Path C:\Test\Testfile2.txt
}
Compare-Object @objects -ExcludeDifferent

Результат приблизно такий:

InputObject  SideIndicator
-----------  -------------
bird        ==

Тут чітко видно, що відображається лише значення "bird" з SideIndicator "==" , що вказує на його присутність в обох наборах. Якщо ви використовували ExcludeDifferent без IncludeEqual у версіях до 7.1, можливо, нічого не відображається, оскільки виключаються як різниці, так і рівності.

Приклад 3: Збереження оригінального типу за допомогою параметра PassThru

За замовчуванням, Compare-Object повертає об'єкти типу PSCustomObject з двома властивостями: InputObject та SideIndicator. Однак, якщо ви хочете продовжити роботу з вихідним типом (наприклад, логічним значенням, процесом, TimeSpan тощо), вам знадобиться параметр -PassThru.

Давайте розглянемо різницю на дуже простому булевому значенні :

$a = $true
Compare-Object -IncludeEqual $a $a
(Compare-Object -IncludeEqual $a $a) | Get-Member

Це показує вивід з властивостями TypeName System.Management.Automation.PSCustomObject та NoteProperty InputObject і SideIndicator, на додаток до типових методів Equals, GetType, ToString тощо.

Якщо ви зараз використовуєте PassThru :

Compare-Object -IncludeEqual $a $a -PassThru
(Compare-Object -IncludeEqual $a $a -PassThru) | Get-Member

У цьому випадку поверненим типом є System.Boolean , і помітно, що екземпляр має додаткову властивість NoteProperty під назвою SideIndicator , хоча це не видно безпосередньо у відформатованому виводі. Ця деталь важлива: фактичний тип є оригінальним, але з додатковою властивістю , яка вказує, чи є значення посиланням, різницею чи обома.

Приклад 4: Порівняння простих рядків за властивостями

Compare-Object призначений не лише для цілих текстів; він також корисний, коли потрібно порівняти властивості певних об'єктів . Наприклад, можна порівняти два рядки, які абсолютно різні за змістом, але мають однакову довжину.

Прикладом може бути:

$objects = @{
ReferenceObject = 'abc'
DifferenceObject = 'xyz'
Property = 'Length'
}
Compare-Object @objects -IncludeEqual

Результат:

  Microsoft Money можна завантажити та встановити на Windows 10.

Length     SideIndicator
------    -------------
3        ==

Оскільки порівнюється лише властивість Length , командлет вказує, що обидва рядки еквівалентні з точки зору цієї властивості, навіть якщо їхній текст не має нічого спільного один з одним.

Приклад 5: Порівняння складних об'єктів зі специфічними властивостями

Коли ви переходите до складніших об'єктів , таких як процеси Windows, все стає цікавішим. Уявіть, що ви зберігаєте два різні процеси PowerShell у різних змінних, але вони мають однакове ім'я процесу.

Без вказівки властивостей, Compare-Object порівнює результат ToString() з System.Diagnostics.Process , який зазвичай є чимось на кшталт "System.Diagnostics.Process (pwsh)", і вважає їх рівними.

Приклад резюме:

$a = Get-Process -Id 11168
$b = Get-Process -Id 17600
$a.ToString()
$b.ToString()
Compare-Object $a $b -IncludeEqual

Вихід:

InputObject  SideIndicator
-----------  -------------
System.Diagnostics.Process (pwsh)  ==

Якщо ви хочете, щоб відмінності дійсно були помітні, вам потрібно вказати певні властивості, такі як ProcessName, Id або CPU:

Compare-Object $a $b -Property ProcessName, Id, CPU

У цьому випадку ви отримаєте щось подібне:

ProcessName  Id      CPU      SideIndicator
-----------  --     ---     -------------
pwsh       17600  11.4375  =>
pwsh       11168  36.203125 <=

Тут вже зрозуміло, який екземпляр є який і чим вони відрізняються своїм ідентифікатором та споживаним процесорним часом.

Приклад 6: Складні об'єкти, що реалізують IComparable

Деякі типи .NET реалізують інтерфейс IComparable , який дозволяє Compare-Object порівнювати їх інтелектуальніше . Якщо об'єкти, що порівнюються, мають різні типи, командлет намагається перетворити DifferenceObject на тип ReferenceObject.

Наприклад, порівняння рядка, що представляє TimeSpan, з самим об'єктом TimeSpan дає два різні випадки залежно від порядку:

Compare-Object ("0:0:1") "0:0:1" -IncludeEqual

Вихід:

InputObject  SideIndicator
-----------      -------------
00:00:01   ==

Тут рядок стає TimeSpan, і обидва об'єкти вважаються рівними. Але якщо ви зміните порядок:

Compare-Object "0:0:1" ("0:0:1")

У вас буде щось на кшталт:

InputObject  SideIndicator
-----------      -------------
00:00:01   =>
0:0:1     <=

У цьому другому сценарії TimeSpan перетворюється на ланцюг, і результат порівняння вважає, що представлення різні.

Важливі параметри об'єкта порівняння

Compare-Object має чимало параметрів , які варто опанувати, щоб отримати від нього максимальну користь. Давайте розглянемо найкорисніші з них із чітким поясненням того, що робить кожен з них.

Варіанти порівняння консолей

Параметр - Чутливий до регістру

Модифікатор -CaseSensitive вказує, що порівняння має бути чутливим до регістру . Без цього параметра PowerShell зазвичай обробляє порівняння без урахування регістру в багатьох контекстах.

Основні можливості:

  • Тип: Параметр перемикача
  • Значення за замовчуванням: Помилковий
  • Не дозволяє використовувати шаблони підстановки
  • Посада: призначена (не посадова)

Параметр -Культура

За допомогою -Culture ви можете вказати посилання на культуру, яке використовується в порівнянні , що дуже корисно під час порівняння рядків, що залежать від мови, певного алфавітного порядку або регіональних правил.

Його властивості:

  • Тип: рядок
  • Значення за замовчуванням: ніхто (використовуйте сучасну культуру)
  • Він не приймає шаблони підстановки
  • Іменований параметр, необов'язковий

Параметр -DifferenceObject

Параметр -DifferenceObject визначає набір об'єктів, які потрібно порівняти з еталонним набором . Він потрібен у будь-якому виклику, який не є суто позиційним, і саме там завантажуються нові дані, «з правого боку».

Відповідні властивості:

  • Тип: PSObject[]
  • Обов'язкове: Правда
  • Приймає вхідні дані конвеєра: Правда
  • Не дозволяє використовувати шаблони підстановки
  • Позиція: 1 (при використанні позиційних параметрів)

Параметр -ExcludeDifferent

Перемикач `-ExcludeDifferent` приховує відмінності та відображає лише збіги між посиланням та різницею. У поєднанні з `IncludeEqual` він зменшує вивід до спільних значень.

Ключові аспекти:

  • Тип: Параметр перемикача
  • Значення за замовчуванням: Хибність
  • Якщо використовувати без IncludeEqual у старіших версіях, результат може бути порожнім.
  • У PowerShell 7.1+ IncludeEqual автоматично передбачає це.

Параметр -IncludeEqual

Параметр `-IncludeEqual` дозволяє відображати елементи, які є рівними в обох наборах. За замовчуванням `Compare-Object` повертає лише відмінності, тому цей параметр повністю змінює тип поверненої інформації.

Подробиці:

  • Тип: Параметр перемикача
  • Значення за замовчуванням: Хибність
  • Після активації вихід може включати як різниці, так і рівності.
  • Коли в SideIndicator з'являється "==", це означає, що значення існує в обох наборах.

Параметр -PassThru

Як було видно раніше, -PassThru вказує, що Compare-Object не повинен обгортати об'єкти в PSCustomObject , а натомість повертати оригінальні об'єкти, додаючи лише властивість SideIndicator як NoteProperty.

Ключові моменти:

  • Тип: Параметр перемикача
  • Значення за замовчуванням: Хибність
  • Ідеально, коли вам потрібно продовжити маніпулювання фактичним типом об'єкта
  • Консоль може приховувати існування SideIndicator, якщо формат типу за замовчуванням його не відображає.

Параметр -Властивість

Модифікатор -Property дозволяє визначити певний набір властивостей для порівняння як у ReferenceObject, так і в DifferenceObject. Замість порівняння всього об'єкта, Compare-Object обмежується цими полями.

Особливості гри:

  • Тип: Об'єкт[]
  • Значення за замовчуванням: Немає
  • Він сам по собі не підтримує шаблони підстановки, але ви можете використовувати обчислювані властивості.
  • Це дозволяє розраховувати властивості, використовуючи блоки сценарій або хеш-таблиці з ключем вираз

Параметр -ReferenceObject

Параметр -ReferenceObject визначає набір об'єктів, що використовуються як основа для порівняння. Це "стара" або контрольна точка, з якою порівнюється DifferenceObject.

Його найважливіші властивості:

  • Тип: PSObject[]
  • Обов'язково: Правда
  • Він не приймає пряме введення каналу (хоча приймає введення за назвою, залежно від використання)
  • Не дозволяє використовувати шаблони підстановки
  • Позиція: 0, якщо ви використовуєте позиційний синтаксис

Параметр -SyncWindow

Параметр -SyncWindow контролює, скільки суміжних об'єктів перевіряє Compare-Object під час спроби повторної синхронізації колекцій, коли немає збігу в одній позиції. Це особливо важливо під час роботи з довгими списками, де між ними можуть бути вставки або видалення.

Властивості:

  • Тип: Int32
  • Значення за замовчуванням: ::MaxValue (тобто, виконує ітерацію по всій колекції)
  • Менші значення можуть покращити продуктивність, але Вони знижують точність ресинхронізації

Загальні параметри

Compare-Object також підтримує поширені параметри PowerShell : -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction та -WarningVariable. Вони не змінюють логіку порівняння, але дозволяють налаштувати поведінку виводу, налагодження та обробки помилок.

Входи та виходи порівняння об'єктів

Під час роботи з Compare-Object важливо чітко розуміти, які типи вхідних даних він приймає та що повертає , оскільки це визначає, як пов'язувати результат з іншими командлетами або скриптами.

Входи

Основний вхід конвеєра отримує DifferenceObject , який приймає об'єкти типу PSObject . Це дозволяє виконувати щось на кшталт отримання даних за допомогою командлета та передавати їх безпосередньо до порівняння без проміжних змінних.

  Створення накладання панелі завдань із системними даними в режимі реального часу

Виходи

Щодо виходу, є два чітко розмежовані випадки:

З одного боку, коли ReferenceObject та DifferenceObject абсолютно однакові , і ви не використовуєте IncludeEqual, командлет нічого не повертає . Це корисно для використання Compare-Object у скриптах, які реагують лише за наявності змін.

З іншого боку, коли виявляються відмінності, Compare-Object повертає об'єкти PSCustomObject з властивістю SideIndicator. Якщо також використовується IncludeEqual і об'єкти рівні, вони також повертаються, але з індикатором "==". Якщо додано PassThru, фактичний тип не змінюється, але кожен екземпляр включає NoteProperty SideIndicator, навіть якщо відформатований вигляд може не відображати його.

Псевдоніми та примітки щодо Compare-Object

У Windows PowerShell містить кілька зручних псевдонімів для швидшого виклику Compare-Object, таких як compare або diff . Ці псевдоніми дуже корисні, коли ви швидко досліджуєте відмінності в консолі, не вводячи повну назву командлета.

Майте на увазі, що під час використання PassThru , вивід консолі може не відображати властивість SideIndicator, оскільки формат за замовчуванням для цього типу об'єкта не включає її у представлення. Це не означає, що властивість не існує: ви можете легко перевірити її за допомогою Get-Member або явно вибравши властивість за допомогою Select-Object.

Приклад з реального світу: порівняння двох списків MAC-адрес в Excel за допомогою PowerShell

Дуже поширеним сценарієм у мережевих середовищах є отримання щотижневого списку невідомих MAC-адрес і необхідність перевірки, які з них вже були досліджені, а які є новими. Щоб уникнути помилок, найкращим підходом є ведення головного файлу з усіма вже перевіреними MAC-адресами та порівняння нового списку з цією історією.

Уявімо, що використовуються дві електронні таблиці:

  • Unknown_Devices.xlsx: сукупний список усіх відомих MAC-адрес та їх обґрунтування.
  • test.xlsx: Новий список на тиждень зі стовпцем «Пристрій Mac».

Неефективним способом вирішення цієї проблеми було б перебирати кожну нову MAC-адресу та перевіряти, чи вона з'являється в попередньому списку, використовуючи прості порівняння, такі як `-ne` . Проблема полягає в тому, що порівняння скалярного значення з цілим стовпцем набору даних Excel працює неналежним чином , і в результаті ви отримуєте майже весь новий список.

Натомість набагато логічніше завантажити обидва файли за допомогою Import-Excel , а потім використовувати Compare-Object, вказавши властивість "Device Mac" для порівняння лише цього стовпця. Щось на кшталт цього:

$PreviousData = Import-Excel -Path 'H:\Unknown_Devices.xlsx'
$NewData = Import-Excel -Path 'C:\Users\usuario\Downloads\test.xlsx'
Compare-Object -ReferenceObject $PreviousData -DifferenceObject $NewData -Property 'Device Mac' |
Where-Object { $_.SideIndicator -eq '=>' }

Таким чином, ви отримаєте лише ті MAC-адреси, які з'являються в новому списку, а не в старому ; саме їх потрібно дослідити та, після підтвердження, додати до головного файлу. Якщо ви також хочете побачити ті, що зникли, вам слід шукати ті, що мають SideIndicator "<=".

Створення HTML-звітів та журналів відмінностей за допомогою PowerShell

Окрім простого відображення текстових відмінностей на екрані, PowerShell дозволяє автоматизувати детальні HTML-звіти та журнали, використовуючи Compare-Object як основу. Детальний приклад може поєднувати:

  • Отримання поточного формату дати та позначення часу для іменування файлів.
  • Використання Start-Transcript та Stop-Transcript для запису всього сеансу в журнал.
  • Визначення слова Стилі CSS форматувати HTML-звіт (шрифти, кольори, таблиці, чергування рядків тощо).
  • Огляд машини або папки за допомогою хеш-таблиці та цикли foreach.
  • Вилучення файлів від постачальників A та B за допомогою Get-ChildItem, фільтруючи за різними датами та розширеннями (txs, txt, PDF).
  • Порівняння процесів за допомогою Compare-Object та інтерпретація SideIndicator для виявлення проблем.
  • Конвертування результатів у HTML за допомогою ConvertTo-Html та налаштування заголовків і стовпців.
  • Надсилання звітів електронною поштою за допомогою Send-MailMessage та додавання згенерованого HTML-коду.

У такому складнішому сценарії зазвичай використовується:

Використовуйте такі властивості, як InputObject та SideIndicator, для створення повідомлень журналу, таких як «Знайдено в день X в обох папках» або «Знайдено різницю між джерелом і місцем призначення». Спеціальні значення, такі як «0000» або «0001», використовуються для позначення того, що машина не генерує файли.

Потім результат форматується за допомогою ConvertTo-Html, замінюючи назви стовпців за допомогою -replace (наприклад, змінюючи InputObject на PROCESS та SideIndicator на STATE) та замінюючи коди "==", "=>" або "<=" на більш читабельні тексти, такі як "OK", "PROBLEM SUPPLIER-X" або "PROBLEM SUPPLIER-A".

Зрештою, все групується в один HTML-файл, включаючи заголовки з тегами <h1> та <h2> , зведену таблицю з кількістю машин та нижній колонтитул з датою створення, перш ніж звіт надсилається електронною поштою потрібним одержувачам.

Оператори та вирази, корисні для доповнення Compare-Object

У багатьох скриптах порівняння PowerShell важливо також опанувати арифметичні, логічні оператори, оператори порівняння, членства та типізації , а також утиліти, такі як -split та -join для маніпулювання рядками.

На арифметичному рівні, окрім +, -, *, /, оператор модуля (%) повертає залишок від цілочисельного ділення. Наприклад, 5%3 дає 2, оскільки 5 дорівнює 1 помноженому на 3 із залишком 2. Ці оператори застосовуються як до літеральних значень, так і до змінних (наприклад, $var1 + $var2 додає вміст обох, якщо вони числові, або об'єднує рядки).

З реляційними операторами PowerShell пропонує варіанти з урахуванням регістру та без нього (-like / -clike, -eq / -ceq тощо). Наприклад, 'Powershell' -like '*shell' повертає True, тоді як 'Powershell' -clike 'p*shell' повертає False, оскільки версія "c" чутлива до регістру.

Оператори членства, такі як -in та -contains, дуже корисні під час фільтрації елементів: 'shell' -in 'Console','shell' повертає True, тоді як 'Console','powershell' -contains 'shell' повертає False. Вони використовуються навпаки, тому ви можете вибрати той, який найкраще відповідає логіці вашої умови.

Також існують оператори типу, такі як -is , які можна використовувати для перевірки, чи значення належить до заданого типу: 'Hello' -is або 20 -is повертає True, тоді як 'B' -is повертає False.

У логічній частині є -і, -або та -не (або його скорочена форма!) . Наприклад, (5 -рівняння 5) -і (8 -рівняння 9) є Хибним, оскільки одна з умов не виконується, тоді як (5 -рівняння 5) -або (8 -рівняння 9) є Істинним. І -не (8 -рівняння 9) також є Істинним, оскільки 8 явно не дорівнює 9.

  Створення контактних груп на телефоні Android

Зрештою, такі оператори, як `-split` та `-join`, дозволяють розділяти та повторно складати рядки. `-split 'PowerShell is simple'` повертає три члени окремо, тоді як `-split ':'` використовує символ двокрапки як роздільник. І навпаки, `-join` може об'єднувати елементи масиву в один рядок з роздільником або без нього.

Порівняння текстів та файлів за допомогою CMD за допомогою fc.exe

Якщо ви віддаєте перевагу класичному командному рядку або перебуваєте в середовищі, де CMD є єдиним варіантом, ви можете використовувати fc.exe , давню команду Windows для порівняння файлів. Хоча її вивід менш гнучкий, ніж у PowerShell, він все ще дуже корисний для швидкого порівняння в текстовому або двійковому режимі.

Основний синтаксис команди fc такий:

fc /a ] <filename1> <filename2>
fc /b <filename1> <filename2>

У текстовому режимі (ASCII) fc порівнює файли рядок за рядком і намагається повторно синхронізувати їх, якщо виявлено розбіжності. У двійковому режимі виконується побайтове порівняння без спроб повторної синхронізації, і це режим за замовчуванням для таких розширень, як .exe, .com, .sys, .obj, .lib або .bin.

Основні параметри fc.exe

До найкорисніших модифікаторів fc належать:

  • /a: скорочує вивід ASCII-порівняння, показуючи лише перший та останній рядки кожної групи відмінностей.
  • /b: примусово виконує побайтове порівняння двійкових даних, корисно для виконуваних файлів або двійкових даних.
  • /c: ігнорує великі та малі літери.
  • /l: вказує на режим ASCII (текст), порівнюючи рядок за рядком.
  • /фунт: встановлює розмір внутрішнього буфера рядків an (за замовчуванням 100); якщо послідовних відмінностей більше, fc може перерватися з повідомленням про занадто різні файли.
  • /n: відображає номери рядків у порівняннях ASCII.
  • /вимкнено: не відкидає файли з атрибутом "офлайн".
  • /t: дозволяє уникнути перетворення табуляції на пробіли; якщо ви його не використовуєте, табуляції обробляються як пробіли через кожну восьму позицію.
  • /u: порівнює файли як текст у кодуванні Unicode.
  • /w: стискає пробіли (табуляцію та пробіли), обробляючи їх як один пробіл та ігнорування початкових та кінцевих пробілів.
  • /нннн: встановлює, скільки послідовних рядків має збігатися після розбіжності, щоб вважатися повторно синхронізованими; значення за замовчуванням — 2.

Крім того, ви можете використовувати символи підстановки, такі як * та ?, в іменах файлів для порівняння цілих наборів. Якщо ви додасте символ підстановки в перше ім'я файлу, fc зіставлятиме кожен вказаний файл з файлом або набором, вказаним у filename2; якщо символ підстановки знаходиться у filename2, fc використовуватиме відповідне ім'я з першого набору.

Коди виходу fc.exe

Після виконання, fc встановлює код виходу , який можна використовувати в пакетних скриптах або автоматизаціях:

  • 0: файли ідентичні.
  • 1: Файли різні.
  • 2: Під час порівняння сталася помилка.

Приклади використання fc.exe

Щоб виконати скорочене порівняння двох звітів у форматі ASCII:

fc /a monthly.rpt sales.rpt

Щоб порівняти два файли у двійковому форматі за допомогою пакетного методу:

fc /b profits.bat earnings.bat

Якщо є відмінності, ви побачите різні шістнадцяткові адреси та байти для кожного файлу. Щось на кшталт цього:

00000002: 72 43
00000004: 65 3A
0000000E: 56 92
000005E8: 00 6E
FC: earnings.bat longer than profits.bat

Якщо вони ідентичні, повідомлення буде більш прямим:

Comparing files profits.bat and earnings.bat
FC: no differences encountered

Ви також можете порівняти всі файли .bat у поточному каталозі з певним файлом:

fc *.bat new.bat

Або порівняйте файли new.bat на різних дисках:

fc c:new.bat d:*.bat

І порівняйте всі .bat-файли з C:\ з однаковими іменами на D:\:

fc c:*.bat d:*.bat

Коли fc виконує ASCII-порівняння дуже великих файлів, за замовчуванням використовується внутрішній буфер зі 100 рядків . Якщо знаходить більше цієї кількості послідовних різних рядків, може повернути повідомлення "Помилка повторної синхронізації. Файли занадто різні". Для бінарних порівнянь дуже великих файлів fc прозоро перекриває блоки в пам'яті до завершення.

Тонкі деталі при порівнянні «ідентичних» текстових файлів

Цікавий випадок, який часто виникає, – це зустріч із двома текстовими файлами, які виглядають ідентично в редакторі або інструменті порівняння, але поводяться по-різному в певній програмі. Навіть при виборі всього в обох програмах ви можете побачити різну кількість символів, наприклад, 6502 проти 6501.

Цей тип розбіжності зазвичай пов'язаний з невидимими символами : керуючим символом, BOM (Byte Order Mark) у кодуваннях Unicode, додатковим розривом рядка в кінці файлу, відмінностями між CRLF та LF або пробілом, який інструмент порівняння ігнорує, якщо він налаштований не показувати зміни пробілів.

Коли програмне забезпечення вимагає дуже специфічного текстового формату, ці деталі мають вирішальне значення. Ось чому, якщо щось «не складається», доцільно перевірити кодування файлу, закінчення рядків і використовувати двійкове порівняння (за допомогою fc /bo або подібних інструментів), щоб виявити будь-які зайві або відсутні байти.

Як Compare-Object у PowerShell, так і fc.exe в CMD надають потужний арсенал для порівняння тексту, файлів та колекцій об'єктів. Використовуючи їх ефективно, ви можете виявляти зміни між версіями, створювати зручні для читання HTML-звіти, фільтрувати певну інформацію (наприклад, нові записи у списку MAC-адрес) і навіть інтегрувати ці дані в автоматизовані процеси моніторингу або перевірки, заощаджуючи години ручного перегляду та значно зменшуючи кількість людських помилок.

Як порівнювати та об'єднувати документи у Word 3
Пов'язана стаття:
Як порівнювати та об'єднувати документи в Word