как мне различить два текстовых файла в windows powershell?

<p>у меня есть два текстовых файла, и я хочу найти различия между ними с помощью windows powershell. есть ли что-то похожее на инструмент сравнения unix? или есть другой способ, который я не рассмотрел?</p><p>я пробовал сравнить объект, но получить этот загадочный вывод:</p><pre><code>ps c:\> compare-object one.txt two.txt inputobject sideindicator ----------- ------------- two.txt => one.txt <= </code></pre>

<p>сам разобрался. поскольку powershell работает с объектами .net, а не с текстом, вам необходимо использовать get-content для отображения содержимого текстовых файлов. чтобы выполнить то, что я пытался сделать в этом вопросе, используйте:</p><pre><code>compare-object (get-content one.txt) (get-content two.txt) </code></pre>

<p>более простой способ сделать это - написать:</p><pre><code>diff (cat file1) (cat file2) </code></pre>

<p>или вы можете использовать команду dos <code>fc</code> примерно так (это показывает вывод обоих файлов, поэтому вам придется искать различия):</p><pre><code>fc.exe filea.txt fileb.txt > diff.txt </code></pre><p><strong><code>fc</code> является псевдонимом для командлета format-custom, поэтому обязательно введите команду как <code>fc.exe</code></strong>. обратите внимание, что многие утилиты dos не поддерживают кодировку utf-8.</p><p>вы также можете запустить процесс cmd и запустить внутри него <code>fc</code>.</p><pre><code>start cmd "/c ""fc filea.txt fileb.txt >diff.txt""" </code></pre><p>это указывает powershell запустить процесс с помощью программы cmd, используя параметры в кавычках. в кавычках есть опция '/ c' cmd для запуска команды и завершения. фактическая команда для запуска cmd в процессе: <code>fc filea.txt fileb.txt</code> перенаправить вывод в файл <code>diff.txt</code>.</p><p>вы можете использовать dos <code>fc.exe</code> изнутри powershell.</p>

<p>diff on * nix не является частью оболочки, а является отдельным приложением.</p><p>есть ли причина, по которой вы не можете просто использовать diff.exe под powershell?</p><p>вы можете скачать версию из пакета unxutils ( <a href="http://unxutils.sourceforge.net/">http://unxutils.sourceforge.net/</a> )</p>

<p>сравнивать объект (он же diff) является жалким, если вы ожидаете, что он будет вести себя как unix diff. я попробовал diff (gc file1) (gc file2), и если строка слишком длинная, я не вижу фактического diff и, что более важно, я не могу сказать, на каком номере строки находится diff.</p><p>когда я пытаюсь добавить -passthru, я теперь вижу разницу, но я теряю, в каком файле находится разница, и все равно не получаю номер строки.</p><p>мой совет, не используйте powershell, чтобы найти различия в файлах. как кто-то еще заметил, fc работает и работает немного лучше, чем compare-object, и еще лучше загружает и использует реальные инструменты, такие как эмулятор unix, который упоминал mikeage.</p>

<p>как уже отмечали другие, если вы ожидаете вывод unix-y diff, то использование псевдонимов powershell сильно подведет вас. во-первых, вы должны держать руку на деле при чтении файлов (с помощью gc/get-content). с другой стороны, индикатор разницы справа, вдали от контента - это кошмар читабельности.</p><p>решение для тех, кто ищет вменяемый вывод:</p><ol> <li>получить реальный diff (например, от gnuwin32)</li> <li>edit% userprofile%\documents\windowspowershell\microsoft.powershell\_profile.ps1</li> <li> <p>добавить строку</p> <pre><code>remove-item alias:diff -force </code></pre></li> </ol><p>аргумент -force необходим, потому что powershell весьма ценен в этом конкретном встроенном псевдониме. если кому-то интересно, установив gnuwin32, я также добавлю следующее в свой профиль powershell:</p><pre><code>remove-item alias:rm remove-item alias:mv remove-item alias:cp </code></pre><p>главным образом потому, что powershell не понимает аргументы, которые запускаются вместе и вводят, например, "rm -force -recurse" - это гораздо больше усилий, чем "rm -rf".</p><p>у powershell есть некоторые приятные функции, но есть некоторые вещи, которые он не должен делать для меня.</p>

<p> <a href="http://winmerge.org/">winmerge</a> - еще один хороший инструмент сравнения на основе графического интерфейса.</p>

<p>\_<code>fc.exe</code>\_ лучше подходит для сравнения текста, поскольку он предназначен для работы подобно * nix diff, то есть сравнивает строки последовательно, показывая реальные различия и пытаясь выполнить повторную синхронизацию (если различные разделы имеют разную длину). он также имеет несколько полезных опций управления (текстовый/двоичный, чувствительность к регистру, номера строк, длина ресинхронизации, размер буфера несоответствия) и обеспечивает состояние выхода (-1 неправильный синтаксис, 0 файлов одинаковы, 1 файл отличается, 2 файла отсутствуют). будучи (очень) старой утилитой dos, она имеет несколько ограничений. в частности, он не работает автоматически с юникодом, рассматривая 0 msb ascii символов как терминатор строки, поэтому файл становится последовательностью из 1 строки символов (@kennycoc: используйте параметр/u чтобы указать оба файла - unicode, winxp и далее), он также имеет размер буфера жесткой строки 128 символов (128 байтов ascii, 256 байтов unicode), поэтому длинные строки разделяются и сравниваются по отдельности.</p><p>объект сравнения предназначен для определения, являются ли 2 объекта идентичными по элементам. если объекты являются коллекциями, то они обрабатываются как наборы (см. справочный объект сравнения), т. е. коллекции unordered без дубликатов. 2 набора равны, если они имеют одинаковые элементы, независимо от порядка или дублирования. это сильно ограничивает его полезность для сравнения текстовых файлов на предмет различий. во-первых, поведение по умолчанию собирает различия до тех пор, пока не будет проверен весь объект (файл = массив строк), что приведет к потере информации, касающейся положения различий, и сокрытию различий в парах (и нет понятия номера строки для set строк). использование -synchwindow 0 приведет к тому, что различия будут генерироваться по мере их возникновения, но не будет пытаться выполнить повторную синхронизацию, поэтому, если в одном файле есть дополнительная строка, последующие сравнения строк могут завершиться неудачей, даже если файлы в противном случае идентичны (пока не будет компенсатор дополнительная строка в другом файле, выравнивая соответствующие строки). тем не менее, powershell является чрезвычайно универсальным и полезное сравнение файлов может быть сделано с помощью этой функциональности, хотя и за счет существенной сложности и с некоторыми ограничениями на содержание файлов. если вам нужно сравнить текстовые файлы с длинными (> 127 символов) строками и в которых строки в основном совпадают 1: 1 (некоторые изменения в строках между файлами, но без дублирования в файле, такие как текстовый список записей базы данных, имеющих ключевое поле) затем, добавив информацию в каждую строку, указав, в каком файле он находится, его положение в этом файле, а затем проигнорировав добавленную информацию во время сравнения (но включив ее в выходные данные), вы можете получить * nix diff-подобный вывод следующим образом (используются псевдонимы сокращения ):</p><pre>\_<code>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,$\_ })</code>\_ получает содержимое файла и предварительно добавляет номер строки и индикатор файла (<< или >>) к каждой строке (используя оператор строки формата) перед передачей его в diff.</li> <li><code>-property { $_.substring(9) } говорит diff сравнивать каждую пару объектов (строк), игнорируя первые 9 символов (которые являются номером строки и индикатором файла). при этом используется возможность указать вычисляемое свойство (значение блока скрипта) вместо имени свойства. _-passthru_ заставляет diff выводить разные входные объекты (которые включают номер строки и индикатор файла) вместо отличающихся сравниваемых объектов (которые этого не делают). _sort-object_ затем переводит все строки в последовательность. out-string останавливает усечение вывода по умолчанию, чтобы соответствовать ширине экрана (как отметил марк тауэрсап), указав ширину, достаточно большую, чтобы избежать усечения. обычно этот вывод помещается в файл, который затем просматривается с помощью прокручиваемого редактора (например, блокнота). записьформат номера строки {0,6} дает выравниваемый справа пробел номер строки из 6 символов (для сортировки). если файлы имеют более 999 999 строк, просто измените формат на более широкий. это также требует изменения параметра _$\_.substring</code>\_ (на 3 больше ширины номера строки) и внешнего значения xx (максимальная длина строки + параметр \_<code>$\_.substring</code>\_).</p>

<p>также есть <a href="http://www.grigsoft.com/download-windiff.htm">windiff</a> , который обеспечивает интерфейс с графическим интерфейсом (отлично подходит для использования с программами cvs/svn на основе gui)</p>