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