![]() |
Сравнение строк текстовых файлов, найти разницу.
Всем привет. Нужна помощь.
Есть 2 текстовых файла, внутри каждого построчно списки файлов, 1 строка - 1 название файла. Задача найти файлы которые есть в первом файле и нет во втором и наоборот. Вот файлы: ______________________________________________ files.txt _________ test2.bat test3.bat LR.bat LR1(‘а*ў*Ґ*ЁҐ f Ё f1 ў compare).bat files_07.2021.txt files_08.2021.txt ’‡ ‹ђ Ћ‘.txt files.txt files2.txt files_10.2021.txt dif.txt test.bat lists.txt null date.txt 0411.bat ________________ files2.txt _______________ LR.bat LR1(‘а*ў*Ґ*ЁҐ f Ё f1 ў compare).bat files_07.2021.txt files_08.2021.txt ’‡ ‹ђ Ћ‘.txt files_10.2021.txt dif.txt test.bat lists.txt null date.txt 0411.bat 0511.bat Ђ«Ј®аЁв¬.txt ______________________________________ Пока написал вот такой код: он записывает имена файлов из файлов построчно в массивы и сравнивает, выводит если есть совпадение. Тут массивы дублируются псевдомассивами в каждой обработке файлов, это конечно можно убрать. Просто пытаюсь хоть как-то это победить. План был при совпадении строк заменять их например на 0. Затем перебрать массивы и вывести все значения что не 0 в одном списке и во втором. Код:
@echo off Я нихрена не понимаю: 1. Почему я потом не могу циклом for /l перебрать массивы? 2. Как вывести элемент массива вне цикла не по конкретному индексу, а указывая индекс переменной. В цикле выводится а вне цикла нет. 3. Внутри цикла set myar2[%%i]=0 не меняет значения элемента. Как сделать чтоб менял? 4. Почему где-то операция в кавычках, где -то %%, где-то !!. Я конечно сам это написал но путем копипаста экспериментов и изучения кучи всяких документаций. Но по этому синтаксису внутри цикла так и не нашел ничего внятного. Если кто скажет где почитать буду признателен. 5. Если выводить переменную k или l внутри цикла она не меняет значения, только по окончании, как это работает? Где почитать? 6. Должен ли внутри цикла работать GOTO? Если кто-то сможет с этим разобраться, возможно есть более простой способ, буду очень благодарен. |
Цитата:
Код:
diff (gc files1.txt) (gc files2.txt) Код:
InputObject SideIndicator |
Код:
@Echo Off Тестовые данные и результат
Цитата:
Цитата:
Цитата:
Код:
>nul chcp 1251 |
Alexlook, глобальная цель какова? Тупо WinMerge не устроит?
Скрытый текст
![]() |
Цитата:
2. Именно так как описано в вопросе - никак, см. п.1 3. Чтобы меняло значение, нужно использовать не %% а !!. Читать в расширенную обработку команд -> тык 4, 5. Все та же ссылка, что и в п.3 6. Должен, но использовать его не нужно. Цикл подразумевает под собой обработку некоторого количества значений до выполнения некоторого условия, в то время как GOTO совершает безусловный переход. Это не есть правильно. Кроме того - добавляет головной боли при отладке. Что же касается создания результирующего файла мне больше нравится Compare-Object , да и для обработки массивов лучше гонять powershell. Сказать обо что-нибудь подробнее можно будет только после озвучивания окончательной цели, а то может тут большая часть телодрыжества бесполезна... |
YuS_2,
Цитата:
Цитата:
Все думал столько команд неужели нужно изобретать что-то для такой задачи. Спасибо большое, на выходных думаю доделаю! Цитата:
Разработать командный файл, который формировал бы ежемесячный отчет об изменениях в рабочем каталоге (файлы созданные, удаленные). Необходимо хранить список файлов в файле истории. WinMerge кажется не подойдет. Спасибо. Цитата:
|
Цитата:
|
Alexlook,
Цитата:
Код:
@Echo Off Пояснения
Цитата:
Я стараюсь избегать применения Setlocal EnableDelayedExpansion так как применение ! в текстовых литералах при этом приведёт к ошибке. Для Вашего случая, в имени файлов при таком SetLocal не должно быть "!". Но вообще-то работать с текстами в CMD - надо очень осторожно, есть много служебных символов в CMD, которые, если встретятся в литерале, сломают любую вашу логику. В примере я применил процедуру (кто-то меня поправит - псевдопроцедуру) Для облегчения понимания её работы вот кусок для одного массива (псевдомассива, чтобы никого не раздражать) без процедуры. Код:
@Echo Off Насчёт GoTo в цикле
Если GoTo ссылается на метку внутри цикла, у меня не получается. Я использую GoTo внутри цикла на метку вне цикла, чтобы выйти из цикла.
Лучше использовать If Код:
@Echo Off |
Нету там никаких массивов. Квадратные скобки - часть имени переменной.
|
Цитата:
|
Время: 23:45. |
Время: 23:45.
© OSzone.net 2001-