|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Объединение текстовых файлов рекурсивно в файлы с именем подпапок. |
|
CMD/BAT - [решено] Объединение текстовых файлов рекурсивно в файлы с именем подпапок.
|
Пользователь Сообщения: 59 |
Профиль | Отправить PM | Цитировать Здравствуйте.
Нужен батник, который бы в каждой папке и подпапке объединял лежащие в них текстовые файлы в один текстовый файл (без удаления оригиналов). В каждой директории - свой объединенный файл. При этом, чтобы имя этого файла соответствовало имени папки, в которой он сформирован. Объединения вполне достаточно через copy /b (все текстовые файлы в одной кодировке). Но с рекурсией и присвоением имени задачу не одолел. |
|
Отправлено: 13:46, 17-01-2019 |
Пользователь Сообщения: 59
|
Профиль | Отправить PM | Цитировать megaloman, в каждой папке не более 99 штук файлов с расширением txt, содержащих по 10-15 строк текста. (99 - это, конечно, просто двузначный лимит для маски, если он понадобится. Обычно, их не более 20 в папке, но может быть и много).
Кроме текстовых файлов, в папках может быть что угодно. Поэтому нужно использовать маску *.txt Учитывая, что предполагается создание тоже текстового файла, хорошо бы исключать задваивание их текстов с текстами оригиналов при последующих запусках батника - то есть, исключить при объединении текстов те файлы, имена которых совпадают с названием папок, где они хранятся. |
Отправлено: 15:16, 17-01-2019 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2706
|
Профиль | Отправить 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 |
Ветеран Сообщения: 2706
|
Профиль | Отправить 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 |
------- Отправлено: 17:04, 17-01-2019 | #4 |
Пользователь Сообщения: 59
|
Профиль | Отправить PM | Цитировать megaloman,
по первому варианту - chcp так и оставил, в BoxIn прописал "текущую папку" %~dp0 Код новые текстовые файлы рекурсивно генерирует с именем папок. Но в самих файлах - путь текущей папки и пути к оригинальным файлам через "more", а не тексты файлов. Включая путь к новому файлу. Вероятно, какая-то ошибка в предпоследней строке. Раскрыл выполнение в окне батника - после этой строки пишет "Слишком много аргументов в командной строке". Заменил значение BoxIn на точный путь к папке - вообще не формирует новые файлы. Посмотрите еще раз, пожалуйста. megaloman, Второй вариант - отработал отлично! Его и забираю. Спасибо! |
|
Отправлено: 17:06, 17-01-2019 | #5 |
Ветеран Сообщения: 2706
|
Профиль | Отправить PM | Цитировать Цитата NuclearBox:
@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 |
Пользователь Сообщения: 59
|
Профиль | Отправить PM | Цитировать megaloman, Теперь батник все верно отработал. Спасибо большое!
|
Отправлено: 17:33, 17-01-2019 | #7 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|