У меня есть два текстовых файла, и я хочу найти различия между ними с помощью Windows Powershell. Есть ли что-то похожее на инструмент сравнения Unix? Или есть другой способ, который я не рассмотрел?
Я пробовал сравнить объект, но получить этот загадочный вывод:
PS C:\> compare-object one.txt two.txt
InputObject SideIndicator
----------- -------------
two.txt =>
one.txt <=
windows
powershell
Брайан Уиллис
источник
источник
-SyncWindow 0
Я думаю, вы можете это исправить, хотя я не уверен, что это только недавно. Это не особенно умно об этом, хотя.Более простой способ сделать это - написать:
источник
diff
вообще, как отмечают другие ответы здесь. И когда я использовал более сложное выражение вместо,cat
я получил неправильный вывод, поэтому я присоединюсь к другим в рекомендации, чтобы избежать этого в PowerShell, если вы пришли из * nix.Или вы можете использовать команду DOS
fc
следующим образом (здесь показаны выходные данные обоих файлов, поэтому вам придется искать различия):fc
псевдоним командлета Format-Custom, поэтому обязательно введите команду какfc.exe
. Обратите внимание, что многие утилиты DOS не поддерживают кодировку UTF-8.Вы также можете запустить процесс CMD и запустить
fc
его внутри.Это указывает PowerShell запустить процесс с помощью программы cmd, используя параметры в кавычках. В кавычках есть опция '/ c' cmd для запуска команды и завершения. Фактическая команда, запускаемая cmd в процессе,
fc filea.txt fileb.txt
перенаправляет вывод в файлdiff.txt
.Вы можете использовать DOS
fc.exe
из PowerShell.источник
diff on * nix - это не часть оболочки, а отдельное приложение.
Есть ли причина, по которой вы не можете просто использовать diff.exe под PowerShell?
Вы можете скачать версию из пакета UnxUtils ( http://unxutils.sourceforge.net/ )
источник
git diff
, потому что я уже установил его. Ни то,fc.exe
ни другое неCompare-Object
дало ожидаемого результата.Сравнивать объект (он же diff) является жалким, если вы ожидаете, что он будет вести себя как Unix Diff. Я попробовал diff (gc file1) (gc file2), и если строка слишком длинная, я не вижу фактического diff и, что более важно, я не могу сказать, на каком номере строки находится diff.
Когда я пытаюсь добавить -passthru, я теперь вижу разницу, но я теряю, в каком файле находится разница, и все равно не получаю номер строки.
Мой совет, не используйте PowerShell, чтобы найти различия в файлах. Как кто-то еще заметил, fc работает и работает немного лучше, чем Compare-Object, и еще лучше загружает и использует реальные инструменты, такие как эмулятор Unix, который упоминал Mikeage.
источник
-SyncWindow
и maxint по умолчанию. Если установить значение 0, это не будет работать так же,diff
как и ... И когда я передал канал в(... | select-object ...)
качестве входных данных, он просто напечатал чепуху, поэтому я сдался.Как уже отмечали другие, если вы ожидаете вывод unix-y diff, то использование псевдонимов powershell сильно подведет вас. Во-первых, вы должны держать руку на деле при чтении файлов (с помощью gc / get-content). С другой стороны, индикатор разницы справа, вдали от контента - это кошмар читабельности.
Решение для тех, кто ищет вменяемый вывод:
добавить строку
Аргумент -force необходим, потому что Powershell весьма ценен в этом конкретном встроенном псевдониме. Если кому-то интересно, установив GnuWin32, я также добавлю следующее в свой профиль powershell:
Главным образом потому, что Powershell не понимает аргументы, которые запускаются вместе и вводят, например, «rm -Force -Recurse» - это гораздо больше усилий, чем «rm -rf».
У Powershell есть несколько приятных функций, но есть некоторые вещи, которые он не должен делать для меня.
источник
WinMerge - еще один хороший инструмент сравнения на основе графического интерфейса.
источник
Есть также Windiff, который предоставляет интерфейс с графическим интерфейсом (отлично подходит для использования с программами CVS / SVN на основе GUI)
источник
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:
где хх - длина самой длинной строки + 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
параметр).источник