Как делают меня разность два текстовых файла в Windows Powershell?

Учитывая, что все больше приложений в Windows использует IP для возражения себе, вероятно, включая многую службу Windows я видел, что кто-то изменил localhost для указания где-то в другом месте как являющийся интересным вектором атаки. Мое предположение - это, был изменен как часть SDL Microsoft.

99
задан 7 May 2009 в 06:43
10 ответов

Изображенный это самостоятельно. Поскольку Powershell работает с объектами .NET, а не текстом, необходимо использовать получать-содержание для представления содержания текстовых файлов. Таким образом для выполнения, что я пытался сделать в вопросе используйте:

compare-object (get-content one.txt) (get-content two.txt)
105
ответ дан 28 November 2019 в 19:21

WinMerge является другим хорошим основанным на GUI различным инструментом.

2
ответ дан 28 November 2019 в 19:21

разность на *отклоняет, не часть оболочки, но отдельное приложение.

Есть ли какая-либо причина, Вы не можете только использовать diff.exe под PowerShell?

Можно загрузить версию с пакета UnxUtils (http://unxutils.sourceforge.net/)

7
ответ дан 28 November 2019 в 19:21

Существует также Windiff, который обеспечивает интерфейс разности GUI (большой для использования с GUI базирующиеся программы CVS/SVN)

1
ответ дан 28 November 2019 в 19:21

Более простой способ сделать он должен написать:

diff (cat file1) (cat file2)
32
ответ дан 28 November 2019 в 19:21

Или вы можете использовать команду DOS fc следующим образом (это показывает вывод обоих файлов, поэтому вам придется сканировать на предмет различий):

fc.exe filea.txt fileb.txt > diff.txt

fc - это псевдоним для командлета Format-Custom, поэтому обязательно введите команду как fc.exe . Обратите внимание, что многие утилиты DOS не обрабатывают кодировку UTF-8.

Вы также можете создать процесс CMD и запустить в нем fc .

start cmd "/c  ""fc filea.txt fileb.txt >diff.txt"""

Это дает PowerShell команду запустить процесс с ' cmd 'с параметрами в кавычках. В кавычках указан параметр cmd '/ c' для запуска и завершения команды. Фактическая команда, выполняемая cmd в процессе, - это fc filea.txt fileb.txt , перенаправляющая вывод в файл diff.txt .

Вы можете использовать DOS ] fc.exe из PowerShell.

30
ответ дан 28 November 2019 в 19:21

compare-object (он же diff псевдоним) жалок, если вы ожидаете, что он будет вести себя как-то вроде unix diff. Я попробовал diff (gc file1) (gc file2), и если строка слишком длинная, я не могу увидеть фактическую разницу и, что более важно, я не могу сказать, по какому номеру строки используется разница.

Когда Я пытаюсь добавить -passthru, теперь я вижу разницу, но теряю, в каком файле есть разница, и все еще не получаю номер строки.

Мой совет: не используйте PowerShell для поиска различий в файлах . Как заметил кто-то другой, fc работает и работает немного лучше, чем compare-object, и еще лучше - это загрузка и использование реальных инструментов, таких как эмулятор unix, о котором упоминал Майкидж.

4
ответ дан 28 November 2019 в 19:21

Как отмечали другие, если вы ожидали вывода unix-y diff, использование псевдонима powershell diff сильно подведет вас. Для одной вещи,вы должны держать руку на пульсе при чтении файлов (с помощью gc / get-content). Во-вторых, индикатор различия находится справа, вдали от содержимого - это кошмар для удобочитаемости.

Решение для тех, кто ищет нормальный результат, -

  1. получить настоящую разницу (например, из GnuWin32)
  2. отредактируйте% USERPROFILE% \ Documents \ WindowsPowerShell \ Microsoft.PowerShell_profile.ps1
  3. добавьте строку

     псевдоним удаления-элемента: diff -force
     

Аргумент -force необходим, потому что Powershell очень важен для этого встроенного псевдонима. Если кому-то интересно, установив GnuWin32, я также включаю в свой профиль PowerShell следующее:

remove-item alias:rm
remove-item alias:mv
remove-item alias:cp

В основном потому, что Powershell не понимает аргументы, которые запускаются вместе и вводятся, например, "rm -Force -Recurse" намного больше усилий, чем "rm -rf".

Powershell имеет несколько хороших функций, но есть некоторые вещи, которые он просто не должен пытаться делать за меня.

3
ответ дан 28 November 2019 в 19:21

fc.exe лучше для сравнения текста, так как он предназначен для работы как *nix diff, т.е. сравнивает строки последовательно, показывая реальные различия и пытаясь пересинхронизировать (если различные участки имеют разную длину). Он также имеет некоторые полезные опции управления (текст/двоичный, чувствительность к регистру, номера строк, длина ресинхронизации, размер буфера несовпадения) и обеспечивает статус выхода (-1 плохой синтаксис, 0 одинаковых файлов, 1 файл отличается, 2 файла отсутствует). Будучи (очень) старой утилитой DOS, она имеет несколько ограничений. В частности, она не работает автоматически с Unicode, считая 0 MSB ASCII символов терминатором строк, поэтому файл становится последовательностью 1 символа (@kennycoc: используйте опцию /U для указания BOTH файлов - Unicode, далее WinXP), а также имеет жесткий буфер строк размером 128 символов (128 байт ASCII, 256 байт Unicode), поэтому длинные строки разделяются и сравниваются по отдельности. Проект сравнения

предназначен для определения того, идентичны ли 2 объекта по члену. если объекты являются коллекциями, то они рассматриваются как SETS (см. справку-объект сравнения), т.е. UNORDERED-коллекции без дубликатов. 2 набора равны, если они имеют одинаковые элементы-члены, независимо от порядка их расположения или дублирования. Это существенно ограничивает его полезность для сравнения текстовых файлов на предмет различий. Во-первых, поведение по умолчанию собирает различия до тех пор, пока не будет проверен весь объект (файл = массив строк), что приводит к потере информации о положении различий и затушевывает вопрос о том, какие различия спарены (а для SET-строк нет понятия номера строки). Использование -synchwindow 0 приводит к тому, что различия будут излучаться по мере их появления, но останавливает его от попыток повторной синхронизации, так что если в одном файле есть дополнительная строка, то последующие сравнения строк могут оказаться неудачными, даже если файлы в противном случае идентичны (до тех пор, пока в другом файле не появится компенсационная дополнительная строка, таким образом, не будет произведено перераспределение совпадающих строк). Тем не менее, powershell чрезвычайно универсален, и полезное сравнение файлов может быть сделано с помощью этой функциональности, хотя и ценой существенной сложности и с некоторыми ограничениями по содержанию файлов. Если вам нужно сравнить текстовые файлы с длинными (> 127 символов) строками, где строки в основном совпадают с 1:1 (некоторые изменения в строках между файлами, но никакого дублирования внутри файла, например, текстовый список записей базы данных, имеющих ключевое поле), то, добавив к каждой строке информацию о том, в каком файле она находится, о ее положении внутри этого файла, а затем проигнорировав добавленную информацию при сравнении (но включив ее в вывод), вы можете получить *nix diff, как в выводе, следующим образом (используются псевдонимы):

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

Explanation

  • (gc file | % -begin { $ln=0 } -process { '{0,6}<<:{1}' -f ++$ln,$_ }) получает содержимое файла и перед передачей его в diff преобразует номер строки и индикатор файла (<< или >>) в каждую строку (используя оператор форматной строки).
  • -свойство { $_.substring(9) } сообщает diff для сравнения каждой пары объектов (строк), игнорируя первые 9 символов (это номер строки и индикатор файла). При этом используется возможность указать вычисленное свойство (значение блока скрипта) вместо имени свойства.
  • -passthru приводит к тому, что вместо различных сравниваемых объектов (которые не включают в себя номер строки и индикатор файла) выводятся различные входные объекты (которые включают в себя номер строки и индикатор файла). Затем
  • -сорт-объект возвращает все строки в последовательность.
    . Out-string останавливает усечение вывода по умолчанию, чтобы соответствовать ширине экрана (как отметил Марк Тауэрсэп), указывая ширину, достаточную для того, чтобы избежать усечения. Обычно этот вывод помещается в файл, который затем просматривается с помощью редактора прокрутки (например, блокнота).

Примечание

Формат номера строки {0,6} дает правильный обоснованный, с пробелами, 6-символьный номер строки (для сортировки). Если в файлах более 999,999 строк, то просто измените формат на более широкий. Это также требует изменения параметра $_.substring (на 3 больше, чем ширина номера строки) и значения out-string xx (максимальная длина строки + $_.substring параметр).

.
1
ответ дан 28 November 2019 в 19:21

Powershell в лучшем случае неудобен и является печальной заменой diff -y. Я пришел сюда, чтобы узнать, как это может работать, и в итоге открыл файлы в блокноте ++. Именно то, что мне было нужно

-1
ответ дан 14 August 2021 в 16:51

Теги

Похожие вопросы