Alexlook
07-11-2021, 16:55
Всем привет. Нужна помощь.
Есть 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?
Если кто-то сможет с этим разобраться, возможно есть более простой способ, буду очень благодарен.
Есть 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?
Если кто-то сможет с этим разобраться, возможно есть более простой способ, буду очень благодарен.