Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Объединение текстовых файлов рекурсивно в файлы с именем подпапок.

Ответить
Настройки темы
CMD/BAT - [решено] Объединение текстовых файлов рекурсивно в файлы с именем подпапок.

Новый участник


Сообщения: 27
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 13:46, 17-01-2019

 

Новый участник


Сообщения: 27
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 15:16, 17-01-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Contributor


Сообщения: 1501
Благодарности: 880

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 16:20, 17-01-2019 | #3


Ветеран


Contributor


Сообщения: 1501
Благодарности: 880

Профиль | Отправить PM | Цитировать


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, то последняя строка предыдущего файла и первая строка последующего сольются в одной строке в консолидированном файле.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:04, 17-01-2019 | #4


Новый участник


Сообщения: 27
Благодарности: 0

Профиль | Отправить PM | Цитировать


megaloman,

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

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

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

Отправлено: 17:06, 17-01-2019 | #5


Ветеран


Contributor


Сообщения: 1501
Благодарности: 880

Профиль | Отправить PM | Цитировать


Цитата 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
...........................
...........................

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:27, 17-01-2019 | #6


Новый участник


Сообщения: 27
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 17:33, 17-01-2019 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Объединение текстовых файлов рекурсивно в файлы с именем подпапок.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - замена файлов и подпапок Peutrov Скриптовые языки администрирования Windows 2 07-02-2018 19:45
CMD/BAT - Хитрое перемещение файлов рекурсивно Maikl_relax Скриптовые языки администрирования Windows 3 02-04-2015 17:12
Разное - [решено] Не запускаются файлы с именем setup.exe (именно с именем) Temix Microsoft Windows 8 и 8.1 13 12-12-2014 22:05
CMD/BAT - найти в папке содержащей много подпапок файлы типа *.bin yas_ Скриптовые языки администрирования Windows 3 30-08-2014 23:52
Последовательная работка файлов из подпапок Lodoss AutoIt 7 09-04-2009 13:53




 
Переход