Показать полную графическую версию : [решено] Объединение текстовых файлов рекурсивно в файлы с именем подпапок.
NuclearBox
17-01-2019, 13:46
Здравствуйте.
Нужен батник, который бы в каждой папке и подпапке объединял лежащие в них текстовые файлы в один текстовый файл (без удаления оригиналов).
В каждой директории - свой объединенный файл. При этом, чтобы имя этого файла соответствовало имени папки, в которой он сформирован.
Объединения вполне достаточно через copy /b (все текстовые файлы в одной кодировке). Но с рекурсией и присвоением имени задачу не одолел.
NuclearBox
17-01-2019, 15:16
megaloman, в каждой папке не более 99 штук файлов с расширением txt, содержащих по 10-15 строк текста. (99 - это, конечно, просто двузначный лимит для маски, если он понадобится. Обычно, их не более 20 в папке, но может быть и много).
Кроме текстовых файлов, в папках может быть что угодно. Поэтому нужно использовать маску *.txt
Учитывая, что предполагается создание тоже текстового файла, хорошо бы исключать задваивание их текстов с текстами оригиналов при последующих запусках батника - то есть, исключить при объединении текстов те файлы, имена которых совпадают с названием папок, где они хранятся.
megaloman
17-01-2019, 16:20
NuclearBox, Вариант 1. В CHCP пропишите кодировку Ваших файлов. Батник сохраните в той же кодировке, если есть в имени BoxIn символы, отличные от английских. Обошелся без Copy@Echo Off
cls
Chcp 1251 >nul
Set "BoxIn=Z:\Box_In"
Set "Ext=txt"
Call :Consol "%BoxIn%" "%Ext%"
FOR /F "usebackq delims=" %%i IN (`2^>nul Dir "%BoxIn%" /B /S /A:D`) DO Call :Consol "%%i" "%Ext%"
Pause
GoTo :Eof
:Consol
2>Nul Del "%~1\%~nx1.%~2"
If Not Exist "%~1\*.%~2" Exit /B 1
>"%~1\%~nx1.%~2" (FOR /F "usebackq delims=" %%i IN (`2^>nul Dir "%~1\*.%~2" /B /A:-D`) DO More "%~1\%%i")
Exit /B
megaloman
17-01-2019, 17:04
NuclearBox, Вариант 2. Если всё-таки с Copy@Echo Off
cls
Set "BoxIn=Z:\Box_In"
Set "Ext=txt"
Call :Consol "%BoxIn%" "%Ext%"
FOR /F "usebackq delims=" %%i IN (`2^>nul Dir "%BoxIn%" /B /S /A:D`) DO Call :Consol "%%i" "%Ext%"
Pause
GoTo :Eof
:Consol
2>Nul Del "%~1\%~nx1.%~2"
If Not Exist "%~1\*.%~2" Exit /B 1
>"%~1\%~nx1.%~2.alltmp" (cd.)
>"%~1\%~nx1.%~2.~tmp" (cd.)
FOR /F "usebackq delims=" %%i IN (`2^>nul Dir "%~1\*.%~2" /B /A:-D`) DO (
1>Nul 2>&1 Move /Y "%~1\%~nx1.%~2.alltmp" "%~1\%~nx1.%~2.~tmp"
>nul Copy "%~1\%~nx1.%~2.~tmp" /B +"%~1\%%i" /B "%~1\%~nx1.%~2.alltmp" /B
)
>nul Move "%~1\%~nx1.%~2.alltmp" "%~1\%~nx1.%~2"
2>Nul Del "%~1\%~nx1.%~2.~tmp"
Exit /B
Возможны неприятности: если последняя строка исходного текстового файла не заканчивается символами 0D 0A, то последняя строка предыдущего файла и первая строка последующего сольются в одной строке в консолидированном файле.
NuclearBox
17-01-2019, 17:06
megaloman,
по первому варианту -
chcp так и оставил, в BoxIn прописал "текущую папку" %~dp0
Код новые текстовые файлы рекурсивно генерирует с именем папок.
Но в самих файлах - путь текущей папки и пути к оригинальным файлам через "more", а не тексты файлов. Включая путь к новому файлу.
Вероятно, какая-то ошибка в предпоследней строке.
Раскрыл выполнение в окне батника - после этой строки пишет "Слишком много аргументов в командной строке".
Заменил значение BoxIn на точный путь к папке - вообще не формирует новые файлы.
Посмотрите еще раз, пожалуйста.
megaloman, Второй вариант - отработал отлично!
Его и забираю. Спасибо!
megaloman
17-01-2019, 17:27
Заменил значение BoxIn на точный путь к папке - вообще не формирует новые файлы. »Покажите Ваш батник. Похоже, при указании пути вы пишете \ в конце. Не надо этого делать. А если батник в самой папке, то надо так, что в первом, что во втором вариантах@Echo Off
cls
Chcp 1251 >nul
Set "Ext=txt"
rem Set "BoxIn=Z:\Box_In"
Set "BoxIn=%~dp0"
If "%BoxIn:~-1%"=="\" Set "BoxIn=%BoxIn:~0,-1%"
Call :Consol "%BoxIn%" "%Ext%"
FOR /F "usebackq delims=" %%i IN (`2^>nul Dir "%BoxIn%" /B /S /A:D`) DO Call :Consol "%%i" "%Ext%"
Pause
GoTo :Eof
...........................
...........................
NuclearBox
17-01-2019, 17:33
megaloman, Теперь батник все верно отработал. Спасибо большое!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.