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

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

Ответить
Настройки темы
CMD/BAT - Разложить файлы в папки по дате создания

Пользователь


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

Профиль | Отправить 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
Вроде все работает и копирует, но в конце вылетает с ошибкой xcopy, все файлы не успевает скопировать
Подозреваю что слишком длинные пути получаются.

Пробовал перевести на 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
Если так то копирует как надо, но только если в пути нет пробела
Цитата:
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------

Начало: 31 октября 2018 г. 15:31:55
Источник : C:\FTP\1\3\
Назначение : C:\FTP\2\2016\02\01\

Файлы: CONS#1_005650.USR

Параметры: /DCOPY:DA /COPY:DAT /R:1000000 /W:30

------------------------------------------------------------------------------
, если только папка с пробелом, не копирует. Например папка АТ СИНИТИ
Цитата:
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------

Начало: 31 октября 2018 г. 15:31:55
Источник - C:\FTP\1\АТ\
Назначение - C:\FTP\Синити\

Файлы:
Параметры: /DCOPY:DA /COPY:DAT /R:1000000 /W:30

------------------------------------------------------------------------------

ОШИБКА: Недопустимый параметр #3 : "C:\FTP\2\2015\08\18"
Как допилить ? Или альтернативный вариант предложите

Отправлено: 14:00, 31-10-2018

 

Ветеран


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

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


surgutfred,
странно, вы же сами в коде пишете:
Цитата surgutfred:
rem обязательно параметр %%a в кавычках "%%a" иначе некорректно обработает пути с пробелами »
и тем не менее в xcopy или в robocopy переменные путей в парные кавычки не берете, на свои же грабли наступаете?
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:59, 31-10-2018 | #2



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

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


Ветеран


Contributor


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

Профиль | Отправить 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
Замечание: копируем файлы по дате последнего изменения. Можно сделать и по дате создания, но придется привлечь wmic, что очень замедлит выполнение
Кроме того, я предполагал, что отображение даты в системе настроено на формат дд.мм.гггг, в противном случае надо код скорректировать

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


Последний раз редактировалось megaloman, 31-10-2018 в 17:25.

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

Отправлено: 17:07, 31-10-2018 | #3


Пользователь


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

Профиль | Отправить 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
Благодарности: 5

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


По-моему все это можно несколько проще записать...
Код: Выделить весь код
@echo off
 
set "src=source_dir"
set "dest=destination_dir"

if not exist "%dest%\." md "%dest%"

for /f "delims=" %%f in ('dir "%src%\*.*" /b /s /a:-d') do (
	for /f "tokens=1,2,3 delims=. " %%a in ("%%~tf") do (
		xcopy "%%f" "%dest%\%%c\%%b\%%a\" /ifchy>>"%dest%\log.txt"
	)
)

Последний раз редактировалось Amunrah, 01-11-2018 в 13:50.

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

Отправлено: 13:13, 01-11-2018 | #5


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


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

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


Цитата Amunrah:
По-моему все это можно несколько проще записать... »
всё работает, только как сделать так, чтобы файлы перемещались, а не копировались

Отправлено: 11:45, 11-03-2024 | #6


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Вставить команду удаления исходного файла.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

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

Отправлено: 04:18, 12-03-2024 | #7


Ветеран


Contributor


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

Профиль | Отправить 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



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Прочие - [решено] Сортирование файлов по папкам (копирование по дате создания) 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




 
Переход