Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Объединение текстовых файлов рекурсивно в файлы с именем подпапок. (http://forum.oszone.net/showthread.php?t=338771)

NuclearBox 17-01-2019 13:46 2852865

Объединение текстовых файлов рекурсивно в файлы с именем подпапок.
 
Здравствуйте.
Нужен батник, который бы в каждой папке и подпапке объединял лежащие в них текстовые файлы в один текстовый файл (без удаления оригиналов).
В каждой директории - свой объединенный файл. При этом, чтобы имя этого файла соответствовало имени папки, в которой он сформирован.
Объединения вполне достаточно через copy /b (все текстовые файлы в одной кодировке). Но с рекурсией и присвоением имени задачу не одолел.

NuclearBox 17-01-2019 15:16 2852886

megaloman, в каждой папке не более 99 штук файлов с расширением txt, содержащих по 10-15 строк текста. (99 - это, конечно, просто двузначный лимит для маски, если он понадобится. Обычно, их не более 20 в папке, но может быть и много).
Кроме текстовых файлов, в папках может быть что угодно. Поэтому нужно использовать маску *.txt

Учитывая, что предполагается создание тоже текстового файла, хорошо бы исключать задваивание их текстов с текстами оригиналов при последующих запусках батника - то есть, исключить при объединении текстов те файлы, имена которых совпадают с названием папок, где они хранятся.

megaloman 17-01-2019 16:20 2852903

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 2852911

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 2852913

megaloman,

по первому варианту -

chcp так и оставил, в BoxIn прописал "текущую папку" %~dp0
Код новые текстовые файлы рекурсивно генерирует с именем папок.
Но в самих файлах - путь текущей папки и пути к оригинальным файлам через "more", а не тексты файлов. Включая путь к новому файлу.
Вероятно, какая-то ошибка в предпоследней строке.
Раскрыл выполнение в окне батника - после этой строки пишет "Слишком много аргументов в командной строке".
Заменил значение BoxIn на точный путь к папке - вообще не формирует новые файлы.
Посмотрите еще раз, пожалуйста.

megaloman, Второй вариант - отработал отлично!
Его и забираю. Спасибо!

megaloman 17-01-2019 17:27 2852919

Цитата:

Цитата NuclearBox
Заменил значение 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 2852920

megaloman, Теперь батник все верно отработал. Спасибо большое!


Время: 05:55.

Время: 05:55.
© OSzone.net 2001-