PDA

Показать полную графическую версию : сравнение содержимого файлов


helldesk
04-06-2023, 21:49
всем привет! в powershell пока плохо разбираюсь, но нужно автоматизировать задачу:
есть две директории C:\dir1 и C:\dir2
в dir1 находится текстовый файл, который нужно сравнить с текстовыми файлами из dir2(их порядка тысячи).
результат сравнения(различия в строках файлах) записывать в директорию C:\dir3, при сохранении нужно сохранить имя файла из dir2(чтобы потом оценить результат сравнения).

нашел в интернете скрипт, но он работает только на сравнение двух файлов. как допилить для моих нужд не понимаю.
https://www.mytechnote.ru/article/powershell-sravnenie-dvuh-tekstovyh-faylov-skript

был бы весьма признателен за помощь!

DJ Mogarych
04-06-2023, 23:18
$sample = gc "C:\dir1\file.txt"

dir "c:\dir2\*.txt" |% {
if ($diff = diff $sample (gc $_.fullname)) {
$diff |Out-File "C:\dir3\$($_.name)" -Encoding utf8
}
}

Sham
05-06-2023, 15:48
Compare-Object для текста мало подходит. Он сравнивает объекты, а не текст. В данном случае - массивы объектов-строк. Для текстового анализа есть fc, diff или git diff например.

YuS_2
05-06-2023, 18:08
Compare-Object для текста мало подходит. »
Чойта?
Он сравнивает объекты, а не текст »
Он сравнивает то, что ему укажешь... кроме того, есть же документация официальная...
Вот, Пример №1 (https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/compare-object?view=powershell-7.3#example-1-compare-the-content-of-two-text-files)
такшта зачем "воду баламутить"? :)

Sham
05-06-2023, 20:12
Надо отличать сравнение объектов типа System.String от посимвольного анализа текста с учётом позиции символов. gc возвращает по умолчанию массив строк, которые потом сравниваются в Compare-Object как IComparable. Если в gc указать -raw, то это уже не будет работать. Для простых случаев построчного сравнения без сохранения позиции строки это годится, но для анализа изменений например в самой строке (внутри объекта типа System.String) уже не подойдёт.

helldesk
05-06-2023, 21:30
$sample = gc "C:\dir1\file.txt"
dir "c:\dir2\*.txt" |% {
if ($diff = diff $sample (gc $_.fullname)) {
$diff |Out-File "C:\dir3\$($_.name)" -Encoding utf8
}
} »


Спасибо! Работает как часы!

Если нужно из сравниваемых файлов удалять первые 8 символов, то должен ли сработать тут TrimStart()?

DJ Mogarych
06-06-2023, 08:57
Из названий или откуда?

YuS_2
06-06-2023, 21:06
Надо отличать »
к чему тут весь этот "ликбез"? ТС-у, что требовалось сравнить? Вот от печки и пляшите...
это раз.

для анализа изменений например в самой строке (внутри объекта типа System.String) уже не подойдёт. »
Чойта, дубль два? Строка у нас, что-то несусветно особенное, что ли? Нет же, это всего лишь, массив символов... вот массивы и надо сравнивать:
diff 'abcd'.tochararray() 'abce'.tochararray()
и все различия найдутся...
это два.

А если сравнивать надо слова, то и подавать на сравнение, надо массивы слов... зачем усложнять то, что усложнений не требует?
а это три. :)

helldesk
06-06-2023, 22:26
Из названий или откуда? »

из каждой строки в файлах директории C:\dir2

DJ Mogarych
06-06-2023, 23:10
Да, сработает.

if ($diff = diff $sample (gc $_.fullname).TrimStart()) {




© OSzone.net 2001-2012