Вопрос: Как удалить два текстовых файла в Windows Powershell?


У меня есть два текстовых файла и вы хотите найти различия между ними, используя Windows Powershell. Есть ли что-то похожее на инструмент Unix diff? Или есть другой другой способ, который я не рассматривал?

Я попытался сравнить объект, но получить этот загадочный вывод:

PS C:\> compare-object one.txt two.txt

InputObject                                                 SideIndicator
-----------                                                 -------------
two.txt                                                     =>
one.txt                                                     <=

70
2018-05-07 03:37


Источник




Ответы:


Выяснил это сам. Поскольку Powershell работает с объектами .net, а не с текстом, вам нужно использовать get-content для отображения содержимого текстовых файлов. Чтобы выполнить то, что я пытался сделать в этом вопросе, используйте:

compare-object (get-content one.txt) (get-content two.txt)

76
2018-05-07 03:51



Я был очень удивлен, когда попытался сравнить два файла: несортированный массив чисел и один и тот же массив чисел после их сортировки. Нет выхода, несмотря на то, что файлы очень разные. По-видимому, compare-object не учитывает порядок. - cgmb
@cgmb - Вы можете использовать -SyncWindow 0 чтобы исправить это, я считаю, хотя я не уверен, что это только недавно было введено. Однако это не особенно умно. - James Ruskin


Или вы можете использовать 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 с использованием параметров в кавычках. В кавычках опция '/ c' cmd запускает команду и завершается. Фактическая команда для выполнения cmd в процессе fc filea.txt fileb.txt перенаправление вывода в файл diff.txt,

Вы можете использовать DOS fc.exe изнутри powershell.


26
2018-05-29 17:52



+1 для вывода DOS ^ _ ^ - Jeff Bridgman
«fc» не работал для меня, и я не понимал, что должен указать его как «fc.exe», чтобы отличить его от Format-Custom. Именно то, что я искал. Благодарю. - Xonatron
Может быть, я полный обыватель, но для меня это гораздо более полезно. Это решило мою проблему очень хорошо. - AJ.


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

diff (cat file1) (cat file2)

22
2017-12-12 19:15



Diff и cat - это просто псевдонимы для Compare-Object и Get-Content в PowerShell. Это одно и то же. - Shawn Melton
несмотря на то, что это то же самое, что и принятый ответ, мне нравится использовать этот синтаксис больше - Elijah W. Gagne


diff on * nix не является частью оболочки, а отдельным приложением.

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

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


7
2018-05-07 03:56



Поскольку PowerShell теперь включен, загружать и устанавливать нечего. - Bratch


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

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

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


3
2018-02-18 18:19





WinMerge это еще один хороший инструмент, основанный на графическом интерфейсе.


2
2018-05-07 04:58



Вот как я это делал в прошлом, это ручной процесс, который я хотел заменить небольшим сценарием. - Bratch


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

Решение для любого, кто ищет эффективный выход,

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

    remove-item alias: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 есть некоторые приятные функции, но есть некоторые вещи, которые он должен просто не пытаться делать для меня.


2
2018-01-28 12:54





Есть также WinDiff который обеспечивает интерфейс интерфейса GUI (отлично подходит для использования с программами CVS / SVN на основе графического интерфейса)


1
2018-05-07 04:17