|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Разложить файлы в папки по дате создания |
|
CMD/BAT - Разложить файлы в папки по дате создания
|
Пользователь Сообщения: 70 |
Профиль | Отправить PM | Цитировать Добрый день.
Есть 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 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2712
|
Профиль | Отправить 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 Сообщения: 6502
|
Профиль | Отправить PM | Цитировать Вставить команду удаления исходного файла.
|
------- Отправлено: 04:18, 12-03-2024 | #7 |
Ветеран Сообщения: 2712
|
Профиль | Отправить 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 |
|