Учитывая, что все больше приложений в Windows использует IP для возражения себе, вероятно, включая многую службу Windows я видел, что кто-то изменил localhost для указания где-то в другом месте как являющийся интересным вектором атаки. Мое предположение - это, был изменен как часть SDL Microsoft.
Изображенный это самостоятельно. Поскольку Powershell работает с объектами .NET, а не текстом, необходимо использовать получать-содержание для представления содержания текстовых файлов. Таким образом для выполнения, что я пытался сделать в вопросе используйте:
compare-object (get-content one.txt) (get-content two.txt)
WinMerge является другим хорошим основанным на GUI различным инструментом.
разность на *отклоняет, не часть оболочки, но отдельное приложение.
Есть ли какая-либо причина, Вы не можете только использовать diff.exe под PowerShell?
Можно загрузить версию с пакета UnxUtils (http://unxutils.sourceforge.net/)
Существует также Windiff, который обеспечивает интерфейс разности GUI (большой для использования с GUI базирующиеся программы CVS/SVN)
Или вы можете использовать команду 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.
compare-object (он же diff псевдоним) жалок, если вы ожидаете, что он будет вести себя как-то вроде unix diff. Я попробовал diff (gc file1) (gc file2), и если строка слишком длинная, я не могу увидеть фактическую разницу и, что более важно, я не могу сказать, по какому номеру строки используется разница.
Когда Я пытаюсь добавить -passthru, теперь я вижу разницу, но теряю, в каком файле есть разница, и все еще не получаю номер строки.
Мой совет: не используйте PowerShell для поиска различий в файлах . Как заметил кто-то другой, fc работает и работает немного лучше, чем compare-object, и еще лучше - это загрузка и использование реальных инструментов, таких как эмулятор unix, о котором упоминал Майкидж.
Как отмечали другие, если вы ожидали вывода unix-y diff, использование псевдонима powershell diff сильно подведет вас. Для одной вещи,вы должны держать руку на пульсе при чтении файлов (с помощью gc / get-content). Во-вторых, индикатор различия находится справа, вдали от содержимого - это кошмар для удобочитаемости.
Решение для тех, кто ищет нормальный результат, -
добавьте строку
псевдоним удаления-элемента: 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 имеет несколько хороших функций, но есть некоторые вещи, которые он просто не должен пытаться делать за меня.
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
(gc file | % -begin { $ln=0 } -process { '{0,6}<<:{1}' -f ++$ln,$_ })
получает содержимое файла и перед передачей его в diff преобразует номер строки и индикатор файла (<< или >>) в каждую строку (используя оператор форматной строки). -свойство { $_.substring(9) }
сообщает diff для сравнения каждой пары объектов (строк), игнорируя первые 9 символов (это номер строки и индикатор файла). При этом используется возможность указать вычисленное свойство (значение блока скрипта) вместо имени свойства. -passthru
приводит к тому, что вместо различных сравниваемых объектов (которые не включают в себя номер строки и индикатор файла) выводятся различные входные объекты (которые включают в себя номер строки и индикатор файла). Затем -сорт-объект
возвращает все строки в последовательность.Формат номера строки {0,6} дает правильный обоснованный, с пробелами, 6-символьный номер строки (для сортировки). Если в файлах более 999,999 строк, то просто измените формат на более широкий. Это также требует изменения параметра $_.substring
(на 3 больше, чем ширина номера строки) и значения out-string xx (максимальная длина строки + $_.substring
параметр).
Powershell в лучшем случае неудобен и является печальной заменой diff -y. Я пришел сюда, чтобы узнать, как это может работать, и в итоге открыл файлы в блокноте ++. Именно то, что мне было нужно