|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Скопировать из множества папок по одному самому новому файлу с переименованием. |
|
|
CMD/BAT - [решено] Скопировать из множества папок по одному самому новому файлу с переименованием.
|
Пользователь Сообщения: 59 |
Здравствуйте.
Задача - собрать (скопировать по маске) из множества папок по одному последнему созданному в них файлу в целевую папку. И при копировании присвоить этим файлам имена исходных папок. Хотелось это сделать через присвоение множества папок одной переменной, поскольку папки могут быть в разных местах и на разную глубину: set "F01=D:\FOLDER1" set "F02=D:\FOLDER2" set "F03=D:\FOLDER3" set FSET="%F01%" "%F02%" "%F03%" Для копирования последних созданных файлов нашел на форуме код уважаемого megaloman http://forum.oszone.net/thread-224061.html Но связать все это вместе не смог. Прошу помочь. Или подскажите альтернативное решение. |
|
Отправлено: 00:47, 12-09-2021 |
Старожил Сообщения: 250
|
Профиль | Отправить PM | Цитировать @NuclearBox это можно связать вместе костыльным методом показанном ниже
но не рекомендую....займтитесь лучще изучением повершела может сначала надо определяться задачей, а уже потом выбирать костыли для ее решения пример @echo OFF setlocal enableextensions enabledelayedexpansion set LIST=X set LIST=!LIST! Y set LIST=!LIST! Z echo LIST=!LIST! :LOOP FOR /F "tokens=1,* delims= " %%a in ('echo !LIST!') do ( SET TOKEN=%%a set LIST=%%b call :PROCESS !TOKEN! if "!LIST!" neq "" GOTO :LOOP ) goto :EOF :PROCESS ECHO processing %1 goto :EOF |
Отправлено: 01:53, 12-09-2021 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать @echo off set "d1=C:\Program Files\Internet Explorer" set "d2=C:\Program Files\7-Zip\Lang" set "d3=D:\Video\Разное\Животные" set "out=C:\OUT" for %%d in ("%d1%" "%d2%" "%d3%") do ( pushd "%%d" for /f "delims=" %%f in ('"dir /a-d/b/o-d/tc|set /p name=^& call echo %%name%%"') do call :#_copy "%%f" "%%d" popd ) pause& exit :#_copy if not exist "%out%" md "%out%" copy "%~1" "%out%\%~nx2%~x1" exit /b Цитата NuclearBox:
|
|
Отправлено: 02:30, 12-09-2021 | #3 |
Пользователь Сообщения: 59
|
Профиль | Отправить PM | Цитировать Serguei Kouzmine, спасибо за ответ и совет. Код попробую применить, ценно по умолчанию. Советом пока не воспользуюсь, дефицит времени. Ищу именно cmd- или bat-решение.
alpap, спасибо большое, Ваши конструкции больше понимаю и учусь на них. Останется добавить отбор файлов по маске, думаю с этим справлюсь. Но по именам Вы правы - файлы затрутся не только при следующем копировании (в моем случае не страшно), но как понимаю и при текущем, если у их папок на диске одинаковое имя. Например, Добавление "староеимяфайла.ext" не спасет, если попадутся файлы и с одинаковыми именами. Есть ли способ добавить не старое имя файла, а имя переменной папки (d1, d2, d3), или порядковый номер, который соответствует их очередности в коде? |
Последний раз редактировалось NuclearBox, 12-09-2021 в 03:18. Отправлено: 03:11, 12-09-2021 | #4 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата NuclearBox:
Цитата NuclearBox:
Если Вы расскажете, что это за файлы, почему они находятся в разных каталогах, с какой именно целью Вы их собираете в одном месте — возможно, Вам подскажут и: Цитата NuclearBox:
![]() |
||||
Отправлено: 03:34, 12-09-2021 | #5 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать Цитата NuclearBox:
@echo off set "d1=C:\Program Files\Internet Explorer" set "d2=C:\Program Files\7-Zip\Lang" set "d3=D:\Video\Разное\Животные" set "out=C:\OUT" for %%d in ("%d1%" "%d2%" "%d3%") do ( set /a n+=1 pushd "%%d" for /f "delims=" %%f in ('"dir /a-d/b/o-d/tc|set /p name=^& call echo %%name%%"') do call :#_copy "%%~f" "%%~d" "%%n%%" popd ) pause& exit :#_copy if not exist "%out%" md "%out%" >nul copy "%~1" "%out%\%~nx2_%~3%~x1" exit /b Цитата NuclearBox:
маску ставить: ...dir /a-d/b/o-d/tc "сюда" ... и тогда стоит записать так с учетом вышенаписанного: ... 2>nul dir /a-d/b/o-d/tc "сюда" ... |
||
Отправлено: 03:38, 12-09-2021 | #6 |
Пользователь Сообщения: 59
|
Профиль | Отправить PM | Цитировать Iska, это файлы, которые периодически формируют программы и специалисты, и которые долго отслеживать, собирать и обрабатывать вручную. Общий каталог нужен для автоматического формирования итоговых файлов на их основе. Просто автоматизация ежедневной работы.
alpap, Роскошно! Это именно то, что нужно. Супер-Пупер код! Работает идеально. "Сюда" - тоже). Еще один полигон для изучения. Огромное спасибо! |
Отправлено: 04:55, 12-09-2021 | #7 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать Цитата NuclearBox:
Цитата NuclearBox:
|
||
------- Последний раз редактировалось megaloman, 12-09-2021 в 10:50. Отправлено: 10:36, 12-09-2021 | #8 |
Пользователь Сообщения: 59
|
Профиль | Отправить PM | Цитировать megaloman, здравствуйте.
Вероятность получить "древний" документ исключена. Устаревшие на заданную глубину дней документы в этих папках сначала переместятся в подпапки old ( http://forum.oszone.net/thread-349519.html ), следующему процессу они будут не видны. Общее количество собираемых файлов менее 30. Какие-то формируются строго ежедневно, какие-то без четкой периодичности, по мере готовности. Известны папки обновления, характер данных, форматы файлов. Для большинства известна структура наполнения. Имена файлов и количество - не подлежат систематизации из-за особенностей программ (как присваиваются имена) и личных предпочтений специалистов (когда и как обновляются - перезаписью или накапливанием, какие названия и т.д.). Совпадение файлов по смыслу и источнику исключено, "смыслы" не пересекаются. Это не новостной сборщик, хотя можно, наверное, с доработкой применять батник и для таких задач. Из собранных файлов постранично формируется несколько профильных файлов + общий документ, автоматизация с помощью конвертеров и Pdftk. |
Отправлено: 14:50, 12-09-2021 | #9 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать Всегда с интересом рассматриваю оригинальное творчество alpap, ИМХО необходимо перед копированием очищать Out.
Немного другой вариант: я не нумерую все файлы, я нумерую файлы только с совпадающими именами, а не сплошняком. Нумерация файлов с одинаковыми именами и разными расширениями из одной папки одинаковая. Учитываю маски. @Echo Off
cls
Set Folders="Z:\Program Files\Internet Explorer" "Z:\Program Files\7-Zip\Lang" "Z:\Video\Разное\Животные" "Z:\Box_In\Program Files\Internet Explorer" "Z:\Box_In\Program Files\7-Zip\Lang" "Z:\Box_In\Video\Разное\Животные"
Set Mask="*.bat" "2*.xlsx"
Set "Out=Z:\Out"
2>nul Pushd "%Out%" &&(2>nul Rd "%Out%" /S /Q &Popd)||(>nul 2>&1 Md "%Out%")
For %%d In (%Folders%) Do Call :MyCopy "%%~d" "%%~nxd" "%Mask%" "%Out%"
For /F "usebackq delims=" %%d In (`2^>nul Dir %Folders% /B /S /A:D`) Do Call :MyCopy "%%d" "%%~nxd" "%Mask%" "%Out%"
pause
Exit /B
:MyCopy
Pushd %1
Set "Add="
If Not Exist "%~4\%~2.*" GoTo :ContMyCopy
Set /A i=100
:Begin
Set /A i+=1
Set "Add=_%i:~-2%"
If Exist "%~4\%~2%Add%.*" GoTo :Begin
:ContMyCopy
Call :MyReCopy %4 %2 "%Add%" %~3
Popd
Exit /B
:MyReCopy
If "%~4"=="" Exit /B
For /F "usebackq delims=" %%f In (`2^>nul Dir %4 /B /A:-D /O:-D /T:W`) Do (>nul Copy "%%f" "%~1\%~2%~3%%~xf" &GoTo :ContMyReCopy)
:ContMyReCopy
Shift /4
GoTo :MyReCopy
Exit /B
|
------- Последний раз редактировалось megaloman, 12-09-2021 в 23:01. Отправлено: 21:33, 12-09-2021 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - Обращение к самому новому/последнему файлу в папке | Sisin | Скриптовые языки администрирования Windows | 38 | 28-06-2019 19:55 | |
PowerShell - копирование файлов из множества папок в одну | oka08@vk | Скриптовые языки администрирования Windows | 2 | 26-03-2019 11:09 | |
CMD/BAT - [решено] bat перемещение из всех вложенных папок в корневую с переименованием | strel9 | Скриптовые языки администрирования Windows | 3 | 13-11-2018 18:46 | |
PowerShell - [решено] Скрипт по сбору строк из множества файлов в один. | Load980 | Скриптовые языки администрирования Windows | 9 | 30-01-2017 08:16 | |
CMD/BAT - [решено] Ежедневное копирование по одному файлу в день | PhantomLo | Скриптовые языки администрирования Windows | 1 | 07-06-2014 01:13 |
|