Компьютерный форум 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=350562)

xxx_RedDevil_xxx 25-01-2022 20:03 2978680

Сортировка файлов по папкам
 
Вложений: 2
Добрый день Товарищи!

Нужна ваша помощь в написании скрипта, испробовал различные варианты с разных форумов, не могу найти решение для своей задачи.

Есть главная директория, в которой содержаться папки соответствующие названию серверов, в этих папках содержаться папки с названиями БД для каждого сервера и уже в каждой папке с БД содержаться zip файлы имена которых соответствует следующей маски "Имя БД_ДД-ММ-ГГГГ_ччмм.zip" (в именах также могут быть "пробелы"), скрин 1:



Все папки и файлы создаются автоматически по определенному скрипту, обновляются и дополняются каждый день.
В папках с БД накопилось много архивов и будут копиться дальше, хотелось бы автоматически сортировать все zip файлы.

Нужно чтобы скрипт заходил в каждую папку с БД, перебирал список файлов, определял дату создания файлов каждой папки (в названии файла тоже есть дата создания, можно по маске из имени файла) и создавал папки "ГГГГ", затем внутри "ММ" в каждой конечной папке и далее перемещал все zip файлы в соответствующую папку с "ГГГГ\ММ", скрин 2:



Перебрал много разных вариантов, уже совсем запутался. Буду весьма признателен сообществу единомышленников за помощь!
Всем хорошего дня!

megaloman 26-01-2022 00:26 2978694

Постановка:
Есть "Директория\Папка"
В ней файлы "Директория\Папка\Папка_ДД-ММ-ГГГГ_ччмм.zip"
Их надо рассортировать по подпапкам:
"Директория\Папка\ГГГГ\ММ\Папка_ДД-ММ-ГГГГ_ччмм.zip"
Если это так, то:
Код:

@Echo Off
cls
        Call :MySort "Z:\Box_Arc\APPV012\Leak Detection System"
        Call :MySort "Z:\Box_Arc\APPV012\PTM for HVAC"
        Call :MySort "Z:\Box_Arc\UATV021\Flert"
pause
Exit /B

:MySort
        FOR /L %%y IN (2000,1,2050) DO For %%m In (01 02 03 04 05 06 07 08 09 10 11 12) Do (
                If Exist "%~1\%~nx1_??-%%m-%%y_????.zip" (
                        2>nul Md "%~1\%%y\%%m"
                        >nul Move "%~1\%~nx1_??-%%m-%%y_????.zip" "%~1\%%y\%%m\"
                )
        )
Exit /B

Пути пропишИте свои.
Чтобы не возиться с выделением из имен года и месяца, забил диапазон годов 2000 ... 2050
Для времени выполнения, ИМХО, это несущественно

yurfed 26-01-2022 03:01 2978698

Цитата:

Цитата megaloman
забил диапазон годов 2000 ... 2050 »

Круто смотрим в будущее.
В 2500 не пробовали заглянуть?

xxx_RedDevil_xxx 26-01-2022 08:34 2978705

Вложений: 2
megaloman, спасибо вам огромное за ваш труд!
Скрипт отлично обрабатывает содержимое папок и перемещает все файлы по соответствующим каталогам, скрин 3:



Вопрос для уточнения, можно ли не в явном виде объявлять пути к конечным проверяемым папкам?
Кол-во папок с названиями серверов могут меняться, особенно сами конечные папки с названиями БД. В разных папках, разное кол-во и они периодически добавляются, скрин 4:



Добавлять их постоянно вручную в скрипт трудоемко.
Можно ли добавить возможность указывать например только изначальную папку откуда нужно начинать проверку, а скрипт сам заходил бы в каждую папку с сервером, далее в ней разное кол-во папок с названиями БД, заходил бы по очереди в каждую папку с названием БД. Далее делал то что было реализовано с файлами и каталогами.

Заранее благодарю.

megaloman 26-01-2022 09:26 2978707

Код:

@Echo Off
cls
        Set "BoxArc=Z:\_Auto_Export_AF_DB_\Scripts\Sorting_Files_Info_Folders\AF_DB_Backup"

        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETime /VALUE') DO Set "YYYY2=%%d"
        Set /A YYYY2=%YYYY2:~0,4%
        Set /A YYYY1=%YYYY2%-1

        FOR /F "usebackq delims=" %%d In (`2^>nul Dir /B /A:D /S "%BoxArc%"`) DO If Exist "%%d\%%~nxd_??-??-2???_????.zip" (
                FOR /L %%y IN (%YYYY1%,1,%YYYY2%) DO For %%m In (01 02 03 04 05 06 07 08 09 10 11 12) Do (
                        If Exist "%%d\%%~nxd_??-%%m-%%y_????.zip" (
                                2>nul Md "%%d\%%y\%%m"
                                >nul Move "%%d\%%~nxd_??-%%m-%%y_????.zip" "%%d\%%y\%%m\"
                        )
                )
        )
pause
Exit /B

Нарисуйте свой путь.
Цитата:

Цитата yurfed
Круто смотрим в будущее.
В 2500 не пробовали заглянуть? »

"Народу русскому пределы не поставлены!"
Чтобы не напрягало, сделал просмотр текущего года и предыдущего (актуально в начале года)
Если, как разовая акция и нужно несколько предыдущих лет, то измените
Set /A YYYY1=%YYYY2%-1
-1 на количество предыдущих годов.

xxx_RedDevil_xxx 26-01-2022 10:11 2978712

Вложений: 1
megaloman, спасибо вам огромнейшее!!! :Beer: :Beer: :Beer:

Ваш скрипт отлично работает, все "Как доктор прописал!!!".

Прописал только путь к главной директории, далее скрипт обработал все внутренние каталоги и переместил файлы по каталогам, скрин 05:



Осталось только адаптировать в алгоритм текущего сценария, но это уже "мелочи жизни".

Спасибо вам еще раз огромное!

Крепкого всем Здоровья и работоспособных сервисов/систем/скриптов!))

Хорошего дня!!! :)


Время: 21:32.

Время: 21:32.
© OSzone.net 2001-