|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Разложить файлы в папки по дате создания |
|
CMD/BAT - Разложить файлы в папки по дате создания
|
Пользователь Сообщения: 70 |
Добрый день.
Есть 2 файлопомойки: 1 С кучей безсистемных папок и в них куча папок с множеством файлов *.usr созданные в разные года. 2 С некоторой системой типа \2018\09.2018\03.09.2018\CONS#64_896377#2018_09_03#13_14_57\CONS#64_896377.USR (жирным скажем так не нужная мне папка, и кроме целевых там еще есть "лишние файлы") Много файлов с одинаковыми именами, но от разных дат Хочу разложить по полочкам, т.е. смотрим дату создания файла *.usr, на полочке создаем 2016\08\23 и туда копируем все файлы созданные в эту дату. Решил так (извините за топорность, я не волшебник, я только учусь): rem Смотрит дату USR и копирует в архив в папку по дате @Echo Off del /q G:\BackUp\USR_Archive\log.txt rem Каталог с помойкой USR set katalog=Y:\USR\ rem Каталог куда ложим USR с разбивкой по периодам set ArchPath=G:\BackUp\USR_Archive\USR_ALL\ rem Ищем в заданном каталоге и вложенных все файлы *.USR rem обязательно параметр %%a в кавычках "%%a" иначе некорректно обработает пути с пробелами For /r %katalog% %%a In (*.usr) Do @Call :Period "%%a" %%~ta rem Теперь каталог с USR интернетчиков set katalog=F:\USR_Archive\INET\ rem обязательно параметр %%a в кавычках "%%a" иначе некорректно обработает пути с пробелами For /r %katalog% %%a In (*.usr) Do @Call :Period "%%a" %%~ta GoTo :EOF rem Определяем дату изменения файла usr, т.е. дату обновления :Period Set f_Nam=%1 Set f_Name=%f_Nam: =% Set f_Dat=%2 Set f_Date=%f_Dat: =% Set f_Day1=%f_Date:~0,2% Set f_Day=%f_Day1: =% Set f_Month1=%f_Date:~3,2% Set f_Month=%f_Month1: =% Set f_Year1=%f_Date:~6,4% Set f_Year=%f_Year1: =% rem Копируем USR в соответствующий период Архив\Год\Месяц xcopy /y %f_Name% %ArchPath%\%f_Year%\%f_Month%\%f_Day%\ /d /f >> G:\BackUp\USR_Archive\log.txt GoTo :EOF Подозреваю что слишком длинные пути получаются. Пробовал перевести на robocopy, но что то не срастается. rem Смотрит дату USR и копирует в архив в папку по дате @Echo Off del /q G:\BackUp\USR_Archive\log.txt rem Теперь каталог с USR интернетчиков set katalog=C:\FTP\1 rem Каталог куда ложим USR с разбивкой по периодам set ArchPath=C:\FTP\2 rem обязательно параметр %%a в кавычках "%%a" иначе некорректно обработает пути с пробелами For /r %katalog% %%a In (*.usr) Do @Call :Period "%%~nxa" "%%~dpa" %%~ta GoTo :EOF rem Определям дату измеения файла usr, т.е. дату обновления :Period Set f_Put=%~2 Set f_Nam=%~1 Set f_Name=%f_Nam: =% Set f_Dat=%3 Set f_Date=%f_Dat: =% Set f_Day1=%f_Date:~0,2% Set f_Day=%f_Day1: =% Set f_Month1=%f_Date:~3,2% Set f_Month=%f_Month1: =% Set f_Year1=%f_Date:~6,4% Set f_Year=%f_Year1: =% rem Копируем USR в соотвествующий период Архив\Год\Месяц robocopy %f_Put% %ArchPath%\%f_Year%\%f_Month%\%f_Day% %f_Name% >> C:\FTP\log.txt GoTo :EOF Цитата:
Цитата:
|
|||
Отправлено: 14:00, 31-10-2018 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать surgutfred,
странно, вы же сами в коде пишете: Цитата surgutfred:
|
|
Отправлено: 16:59, 31-10-2018 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать surgutfred,
Пропишите свои пути и маску. Прпробуйте. Напишите
@Echo Off Set "BoxIn=D:\Мой контент" Set "BoxOut=Z:\Box_Out\Мой контент" Set "Mask=*.bat" rem Set "Mask=*.*" rem Set "Mask=*.pdf *.fb2 *. *.epub" For /F "usebackq delims=" %%d IN (`2^>nul Dir "%BoxIn%" /B /S /A:D`) DO ( Pushd "%%d" &&( For /F "usebackq delims=" %%f IN (`2^>nul Dir "%Mask%" /B /A:-D`) DO ( Set "Nf=%%~tf" Call :MySort "%%f" "%BoxOut%\%%Nf:~6,4%%\%%Nf:~3,2%%\%%Nf:~0,2%%" ) Popd ) ) GoTo :Eof :MySort If Not Exist %2 Md %2 Copy %1 "%~2\" >nul || Echo %1 %2 GoTo :Eof Кроме того, я предполагал, что отображение даты в системе настроено на формат дд.мм.гггг, в противном случае надо код скорректировать |
------- Последний раз редактировалось megaloman, 31-10-2018 в 17:25. Отправлено: 17:07, 31-10-2018 | #3 |
Пользователь Сообщения: 70
|
Профиль | Отправить PM | Цитировать Цитата alpap:
megaloman, спасибо, в очередной раз выручаете. На тестовых папках сработало на ура, загоню на помойки, посмотрим что выйдет. Лишь бы опять команда не загнулась от нагрузки ![]() Почему то на помойках не срабатывает, поменял только пути к папкам. Висит черное окно, и ничего не происходит в конечных папках ничего не появляется. Думал может проблема в том что в имени некоторых папок есть расширение (F:\USR_Archive\INET\2018\09.2018\03.09.2018\CONS#1_044770#2018_08_31#23_38_37.usr\CONS#1_044770.USR ) но скопировав в тестовые папки убедился что работает и с ними. Осталось предположить что у меня слишком большой объем папок с файлами. Он что сначала весь массив считывает перед копированием? Похоже что так, через некоторое время в итоговой папке стали таки появляться результаты. Фух ![]() |
|
Последний раз редактировалось surgutfred, 01-11-2018 в 08:32. Отправлено: 07:07, 01-11-2018 | #4 |
Новый участник Сообщения: 24
|
Профиль | Отправить PM | Цитировать По-моему все это можно несколько проще записать...
|
|
Последний раз редактировалось Amunrah, 01-11-2018 в 13:50. Отправлено: 13:13, 01-11-2018 | #5 |
Новый участник Сообщения: 1
|
Профиль | Отправить PM | Цитировать Цитата Amunrah:
|
|
Отправлено: 11:45, 11-03-2024 | #6 |
fascinating rhythm Сообщения: 6627
|
Профиль | Отправить PM | Цитировать Вставить команду удаления исходного файла.
|
------- Отправлено: 04:18, 12-03-2024 | #7 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать @Echo Off &Cls >nul Chcp 1251 Set "BoxIn=Z:\Box_In" Set "BoxOut=Z:\Box_Out" Set Mask="*.*" Set "Log=Z:\Box_Out\log.txt" Pushd "%BoxIn%" || (Echo Folder "%BoxIn%\" not found &Pause &Exit /B 2) For /F "usebackq delims=" %%f In (`2^>nul Dir %Mask% /S /B /A:-D /O:D`) Do For /F "tokens=1,2,3 delims=. " %%i In ("%%~tf") Do ( If Not Exist "%BoxOut%\%%k.%%j.%%i" Md "%BoxOut%\%%k.%%j.%%i" >nul Move "%%f" "%BoxOut%\%%k.%%j.%%i\"&&>>"%Log%" Echo "%BoxOut%\%%k.%%j.%%i\" ^<--- "%%f" ) Popd Pause Exit /B 0 |
------- Последний раз редактировалось megaloman, 12-03-2024 в 18:05. Отправлено: 16:22, 12-03-2024 | #8 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Прочие - [решено] Сортирование файлов по папкам (копирование по дате создания) | DIMM2005 | Программное обеспечение Windows | 36 | 03-01-2020 16:54 | |
CMD/BAT - Сортирование файлов по папкам (копирование в многоуровневые папки по дате создания) | Systems | Скриптовые языки администрирования Windows | 18 | 03-10-2014 11:37 | |
Любой язык - Удалить файлы по размеру и дате создания (не изменения) | Vlad87 | Скриптовые языки администрирования Windows | 2 | 06-09-2014 15:23 | |
CMD/BAT - Разложить файлы из кучи по каталогам согласно образцу | Maartimus | Скриптовые языки администрирования Windows | 18 | 14-07-2012 13:37 | |
VBS/WSH/JS - [решено] Поделитесь плиз Скрипт сортирующий файлы в папки по месяцу создания | osp2008 | Скриптовые языки администрирования Windows | 5 | 30-06-2010 08:50 |
|