Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Разложить файлы в папки по дате создания (http://forum.oszone.net/showthread.php?t=337491)

surgutfred 31-10-2018 14:00 2838646

Разложить файлы в папки по дате создания
 
Добрый день.
Есть 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"
Как допилить ? Или альтернативный вариант предложите

alpap 31-10-2018 16:59 2838681

surgutfred,
странно, вы же сами в коде пишете:
Цитата:

Цитата surgutfred
rem обязательно параметр %%a в кавычках "%%a" иначе некорректно обработает пути с пробелами »

и тем не менее в xcopy или в robocopy переменные путей в парные кавычки не берете, на свои же грабли наступаете?

megaloman 31-10-2018 17:07 2838686

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

surgutfred 01-11-2018 07:07 2838809

Цитата:

Цитата 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 )
но скопировав в тестовые папки убедился что работает и с ними.

Осталось предположить что у меня слишком большой объем папок с файлами. Он что сначала весь массив считывает перед копированием?


Похоже что так, через некоторое время в итоговой папке стали таки появляться результаты. Фух :)

Amunrah 01-11-2018 13:13 2838879

По-моему все это можно несколько проще записать...
Код:

@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"
        )
)


puhoj 11-03-2024 11:45 3025268

Цитата:

Цитата Amunrah
По-моему все это можно несколько проще записать... »

всё работает, только как сделать так, чтобы файлы перемещались, а не копировались

DJ Mogarych 12-03-2024 04:18 3025294

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

megaloman 12-03-2024 16:22 3025306

Код:

@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

По дате изменения


Время: 06:27.

Время: 06:27.
© OSzone.net 2001-