|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Сравнение строк текстовых файлов, найти разницу. |
|
CMD/BAT - Сравнение строк текстовых файлов, найти разницу.
|
Новый участник Сообщения: 2 |
Всем привет. Нужна помощь.
Есть 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 Setlocal EnableDelayedExpansion EnableExtensions chcp 866 set /a k=0 set /a l=0 set /a j=0 set /a i=0 rem получаю массив строк файла files2.txt for /f "usebackq delims=" %%a in ("files2.txt") do ( set /a k+=1 set "m!k!=%%a" set myar[%%j]=%%a rem echo !myar[%%j]! ) rem получаю массиы строк файла files.txt при это каждую строку сравниваю с каждой из предыдущего если совпадение меняю на 0 for /f "usebackq delims=" %%b in ("files.txt") do ( set /a l+=1 set "n!l!=%%b" set myar2[%%i]=%%b if !myar[%%j]! == !myar2[%%i]! do ( echo !myar[%%j]! set myar2[%%i]=0 echo !myar2[%%i]! >> myar.txt ) rem echo !myar2[%%i]! echo !$l%! ) rem echo !myar2[%%i]! rem echo !myar[%%j]! ) set /a df=12 echo %n12% echo %m12% Я нихрена не понимаю: 1. Почему я потом не могу циклом for /l перебрать массивы? 2. Как вывести элемент массива вне цикла не по конкретному индексу, а указывая индекс переменной. В цикле выводится а вне цикла нет. 3. Внутри цикла set myar2[%%i]=0 не меняет значения элемента. Как сделать чтоб менял? 4. Почему где-то операция в кавычках, где -то %%, где-то !!. Я конечно сам это написал но путем копипаста экспериментов и изучения кучи всяких документаций. Но по этому синтаксису внутри цикла так и не нашел ничего внятного. Если кто скажет где почитать буду признателен. 5. Если выводить переменную k или l внутри цикла она не меняет значения, только по окончании, как это работает? Где почитать? 6. Должен ли внутри цикла работать GOTO? Если кто-то сможет с этим разобраться, возможно есть более простой способ, буду очень благодарен. |
|
Отправлено: 16:55, 07-11-2021 |
Crazy Сообщения: 1231
|
Профиль | Отправить PM | Цитировать |
------- Отправлено: 18:56, 07-11-2021 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2732
|
Профиль | Отправить PM | Цитировать @Echo Off cls Set "File1=Z:\Box_In\files-1.txt" Set "File2=Z:\Box_In\files-2.txt" Echo ------- В файле "%File1%" есть а В файле "%File2%" нет FindStr /I /L /G:"%File2%" /V "%File1%" Echo ------- В файле "%File2%" есть а В файле "%File1%" нет FindStr /I /L /G:"%File1%" /V "%File2%" pause Exit /B Тестовые данные и результат
Цитата Z:\Box_In\files-1.txt:
Цитата Z:\Box_In\files-2.txt:
Цитата Результат:
|
|||
------- Последний раз редактировалось megaloman, 07-11-2021 в 19:55. Отправлено: 19:44, 07-11-2021 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Alexlook, глобальная цель какова? Тупо WinMerge не устроит?
Скрытый текст
![]() |
Отправлено: 22:11, 07-11-2021 | #4 |
Ветеран Сообщения: 992
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Alexlook:
2. Именно так как описано в вопросе - никак, см. п.1 3. Чтобы меняло значение, нужно использовать не %% а !!. Читать в расширенную обработку команд -> тык 4, 5. Все та же ссылка, что и в п.3 6. Должен, но использовать его не нужно. Цикл подразумевает под собой обработку некоторого количества значений до выполнения некоторого условия, в то время как GOTO совершает безусловный переход. Это не есть правильно. Кроме того - добавляет головной боли при отладке. Что же касается создания результирующего файла мне больше нравится Compare-Object , да и для обработки массивов лучше гонять powershell. Сказать обо что-нибудь подробнее можно будет только после озвучивания окончательной цели, а то может тут большая часть телодрыжества бесполезна... |
||
Отправлено: 08:52, 08-11-2021 | #5 |
Новый участник Сообщения: 2
|
Профиль | Отправить PM | Цитировать YuS_2,
Цитата YuS_2:
Цитата megaloman:
Все думал столько команд неужели нужно изобретать что-то для такой задачи. Спасибо большое, на выходных думаю доделаю! Цитата Iska:
Разработать командный файл, который формировал бы ежемесячный отчет об изменениях в рабочем каталоге (файлы созданные, удаленные). Необходимо хранить список файлов в файле истории. WinMerge кажется не подойдет. Спасибо. Цитата Elven:
|
||||
Отправлено: 09:31, 08-11-2021 | #6 |
fascinating rhythm Сообщения: 6666
|
Профиль | Отправить PM | Цитировать Цитата Alexlook:
|
|
------- Отправлено: 10:18, 08-11-2021 | #7 |
Ветеран Сообщения: 2732
|
Профиль | Отправить PM | Цитировать Alexlook,
Цитата:
![]() @Echo Off cls Call :TxtToMass "Z:\Box_In\Файл первый.txt" "@@A" "NA" 10000 Set "@@A" Echo NA=%NA% Echo @@A10005=%@@A10005% Echo. Call :TxtToMass "Z:\Box_In\Файл второй.txt" "@@B" "NB" 10000 Set "@@B" Echo NB=%NB% Echo @@B10003=%@@A10003% Echo. For /L %%i In (10001,1,%NA%) Do Call Echo %%i %%@@A%%i%% Echo. For /F "usebackq tokens=1* delims==" %%i In (`Set "@@A"`) Do Echo %%i %%j Echo. pause Exit /B :TxtToMass Set /A %~3=%~4 For /F "usebackq delims=" %%i In (`2^>nul More %1`) Do ( Call Set /A %~3+=1 Call Set "%~2%%%~3%%=%%i" ) Exit /B Пояснения
Цитата Elven:
Я стараюсь избегать применения Setlocal EnableDelayedExpansion так как применение ! в текстовых литералах при этом приведёт к ошибке. Для Вашего случая, в имени файлов при таком SetLocal не должно быть "!". Но вообще-то работать с текстами в CMD - надо очень осторожно, есть много служебных символов в CMD, которые, если встретятся в литерале, сломают любую вашу логику. В примере я применил процедуру (кто-то меня поправит - псевдопроцедуру) Для облегчения понимания её работы вот кусок для одного массива (псевдомассива, чтобы никого не раздражать) без процедуры. @Echo Off cls Set /A NA=10000 For /F "usebackq delims=" %%i In (`2^>nul More "Z:\Box_In\Файл первый.txt"`) Do ( Call Set /A NA+=1 Call Set "@@A%%NA%%=%%i" ) Set "@@A" Echo NA=%NA% Echo @@A10005=%@@A10005% Echo. For /L %%i In (10001,1,%NA%) Do Call Echo %%i %%@@A%%i%% Echo. For /F "usebackq tokens=1* delims==" %%i In (`Set "@@A"`) Do Echo %%i %%j Echo. pause Exit /B Насчёт GoTo в цикле
|
||
------- Последний раз редактировалось megaloman, 08-11-2021 в 11:46. Отправлено: 10:57, 08-11-2021 | #8 |
Deadooshka Сообщения: 2558
|
Профиль | Отправить PM | Цитировать Нету там никаких массивов. Квадратные скобки - часть имени переменной.
|
Отправлено: 11:01, 08-11-2021 | #9 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Alexlook:
|
|
Отправлено: 00:47, 09-11-2021 | #10 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - Как сравнить разницу в двух текстовых документах и вывести разницу в новый текстовый | mrusklon | Скриптовые языки администрирования Windows | 6 | 31-10-2019 17:05 | |
Любой язык - [решено] Сравнение 2-х текстовых файлов и удаление дубликатов строк в 1-м файле. | Uragan66 | Скриптовые языки администрирования Windows | 2 | 26-05-2019 16:14 | |
CMD/BAT - Сравнение чисел в .txt и двух текстовых файлов | papacoca | Скриптовые языки администрирования Windows | 14 | 01-03-2019 08:00 | |
Сравнение текстовых файлов | Speedy | Программное обеспечение Windows | 9 | 30-03-2015 02:42 | |
Офис и Текст - Автоматическое сравнение текстовых файлов | Kzer-Za | Программное обеспечение Windows | 4 | 04-10-2011 11:50 |
|