Показать полную графическую версию : сравнение содержимого файлов
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
}
}
Compare-Object для текста мало подходит. Он сравнивает объекты, а не текст. В данном случае - массивы объектов-строк. Для текстового анализа есть fc, diff или git diff например.
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)
такшта зачем "воду баламутить"? :)
Надо отличать сравнение объектов типа 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
Из названий или откуда?
Надо отличать »
к чему тут весь этот "ликбез"? ТС-у, что требовалось сравнить? Вот от печки и пляшите...
это раз.
для анализа изменений например в самой строке (внутри объекта типа 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.