Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   сравнение содержимого файлов (http://forum.oszone.net/showthread.php?t=353658)

helldesk 04-06-2023 21:49 3010035

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

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

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

DJ Mogarych 04-06-2023 23:18 3010036

Код:

$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 3010063

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

YuS_2 05-06-2023 18:08 3010068

Цитата:

Цитата Sham
Compare-Object для текста мало подходит. »

Чойта?
Цитата:

Цитата Sham
Он сравнивает объекты, а не текст »

Он сравнивает то, что ему укажешь... кроме того, есть же документация официальная...
Вот, Пример №1
такшта зачем "воду баламутить"? :)

Sham 05-06-2023 20:12 3010072

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

helldesk 05-06-2023 21:30 3010076

Цитата:

Цитата DJ Mogarych
$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 3010087

Из названий или откуда?

YuS_2 06-06-2023 21:06 3010132

Цитата:

Цитата Sham
Надо отличать »

к чему тут весь этот "ликбез"? ТС-у, что требовалось сравнить? Вот от печки и пляшите...
это раз.

Цитата:

Цитата Sham
для анализа изменений например в самой строке (внутри объекта типа System.String) уже не подойдёт. »

Чойта, дубль два? Строка у нас, что-то несусветно особенное, что ли? Нет же, это всего лишь, массив символов... вот массивы и надо сравнивать:
Код:

diff 'abcd'.tochararray() 'abce'.tochararray()
и все различия найдутся...
это два.

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

helldesk 06-06-2023 22:26 3010136

Цитата:

Цитата DJ Mogarych
Из названий или откуда? »

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

DJ Mogarych 06-06-2023 23:10 3010139

Да, сработает.
Код:

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


Время: 17:55.

Время: 17:55.
© OSzone.net 2001-