![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Создание папок по имени и перемещение файлов |
|
|
Любой язык - [решено] Создание папок по имени и перемещение файлов
|
Новый участник Сообщения: 22 |
Добрый день. Помогите алгоритмом решения, примером, готовым решением. Задача обстоит так следующим образом.
В папке D:\backup множество файлов по типу D_Воскресенье_56_my-files_backup.2019-06-09-10-00_00 Есть задача раскладывать их в папку "Неделя 27" -> ''D_Воскресенье" и .т.д. Папки должны генерироваться автоматически в зависимости от того какая неделя. Нашел скрипт который создает папку беря за основу часть из названия файла. А вот как прикрутить создание папки с номером недели и перемещать файлы в актуальную неделю не могу найти решения. @echo off setlocal set "basename=." for /F "tokens=2* delims=_" %%a in ('dir /B /A-D ^| sort /R') do ( set "filename=D_%%a" setlocal EnableDelayedExpansion for /F "delims=" %%c in ("!basename!") do if "!filename:%%c=!" equ "!filename!" ( set "basename=!filename!" md "!basename!" ) move "!filename!_%%b" "!basename!" for /F "delims=" %%c in ("!basename!") do ( endlocal set "basename=%%c ) ) |
|
Отправлено: 13:12, 03-07-2019 |
Ветеран Сообщения: 2735
|
Профиль | Отправить PM | Цитировать Цитата xan08:
2019-06-09 (если это гггг-мм-дд) это воскресенье 23 недели. |
|
------- Отправлено: 17:22, 03-07-2019 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 22
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
|
|
Отправлено: 19:16, 03-07-2019 | #3 |
Ветеран Сообщения: 2735
|
Профиль | Отправить PM | Цитировать xan08,
Использовал известные приёмы для возни с датами, если основываться только на дате, то получается длинно
@Echo Off cls Set "BoxIn=Z:\Box_In" Set "MaskIn=*_backup.20*.*" Set "BoxOut=D:\backup" FOR %%f IN ("%BoxIn%\%MaskIn%") DO Set "FF=%%~nxf" &Call :Out "%%f" "%%FF:*.=%%" "%BoxOut%" Pause GoTo :Eof :Out Set "A=%~2" Set "A=%A:~8,2% %A:~5,2% %A:~0,4%" Call :NweekInYear %A% "NWeek" Set "NWeek=0%NWeek%" Set "NWeek=%NWeek:~-2%" Call :NdayInWeek %A% "DWeek" rem FOR /F "tokens=%DWeek% delims= " %%i IN ("Понедельник Вторник Среда Четверг Пятница Суббота Воскресенье") DO Set "DWeek=%%i" FOR /F "tokens=%DWeek% delims= " %%i IN ("Понедельник Вторник Среда Четверг Пятница Суббота Воскресенье") DO Set "DWeek=%DWeek%_%%i" If Not Exist "%~3\Неделя %NWeek%\D_%DWeek%" Md "%~3\Неделя %NWeek%\D_%DWeek%" >nul Move /Y %1 "%~3\Неделя %NWeek%\D_%DWeek%\" Exit /B rem Номер недели в году дд мм гггг имя_переменной :NweekInYear SetLocal Call :JdayGcal 01 01 %3 "N1" Call :NdayInWeek 01 01 %3 "W1" Call :JdayGcal %1 %2 %3 "N2" EndLocal &Set /A %~4=(%N2%-%N1%+6+%W1%)/7 Exit /B rem Юлианский день по григорианскому календарю дд мм гггг имя_переменной :JdayGcal SetLocal Set "D=0%1" &Set "M=0%2" Set /A D=1%D:~-2%-100,M=1%M:~-2%-100 Set /A A=(14-%M%)/12, Y=%3+4800-A, M=%M%+12*A-3 EndLocal &Set /A %~4=(%D%+(153*%M%+2)/5+365*%Y%+%Y%/4-%Y%/100+%Y%/400-32045) Exit /B rem Номер дня в неделе дд мм гггг имя_переменной :NdayInWeek SetLocal Set "D=0%1" &Set "M=0%2" Set /A D=1%D:~-2%-100,M=1%M:~-2%-100 Set /A i=(%3-1901)*365 + (%3-1901)/4 + %D% + (!(%3 %% 4))*(!((%M%-3)^&16)) EndLocal &Set /A %~4=(%i%+(%M%-1)*30+2*(!((%M%-7)^&16))-1+((65611044^>^>(2*%M%))^&3))%%7+1 Exit /B |
------- Последний раз редактировалось megaloman, 04-07-2019 в 08:23. Отправлено: 00:15, 04-07-2019 | #4 |
Ветеран Сообщения: 2735
|
Профиль | Отправить PM | Цитировать xan08, Если в имени Ваших файлов маска именно такая, как Вы указали, то есть:
D_Имядня_номернедели_траляляляля, то решение многократно проще: @Echo Off cls Set "BoxIn=Z:\Box_In" Set "BoxOut=D:\backup" FOR /F "usebackq tokens=1,2,3* delims=_" %%i IN (`2^>nul Dir "%BoxIn%\D_*_*_*20*.*" /B /A:-D`) DO ( If Exist "%BoxIn%\%%i_%%j_%%k_*20*.*" ( If Not Exist "%BoxOut%\Неделя %%k\%%i_%%j" Md "%BoxOut%\Неделя %%k\%%i_%%j" >nul 2>&1 Move /Y "%BoxIn%\%%i_%%j_%%k_*20*.*" "%BoxOut%\Неделя %%k\%%i_%%j" ) ) Pause GoTo :Eof С точки зрения алфавитной сортировки при просмотре папок, ИМХО, имена папок с днём недели выгодно дублировать номером дня в неделе, например: D:\backup\Неделя 23\D3_среда, D:\backup\Неделя 23\D7_воскресенье
@Echo Off cls Set "BoxIn=Z:\Box_In" Set "BoxOut=D:\backup" Set /A Понедельник=1, Вторник=2, Среда=3, Четверг=4, Пятница=5, Суббота=6, Воскресенье=7 FOR /F "usebackq tokens=1,2,3* delims=_" %%i IN (`2^>nul Dir "%BoxIn%\D_*_*_*20*.*" /B /A:-D`) DO ( If Exist "%BoxIn%\%%i_%%j_%%k_*20*.*" ( Call 2>nul Md "%BoxOut%\Неделя %%k\%%i%%%%j%%_%%j" Call >nul 2>&1 Move /Y "%BoxIn%\%%i_%%j_%%k_*20*.*" "%BoxOut%\Неделя %%k\%%i%%%%j%%_%%j\" ) ) Pause GoTo :Eof |
|
------- Последний раз редактировалось megaloman, 04-07-2019 в 11:21. Отправлено: 08:28, 04-07-2019 | #5 |
Новый участник Сообщения: 22
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Цитата megaloman:
|
||
Отправлено: 06:00, 05-07-2019 | #6 |
Ветеран Сообщения: 2735
|
Профиль | Отправить PM | Цитировать Цитата xan08:
rem FOR /F "tokens=%DWeek% delims= " %%i IN ("Понедельник Вторник Среда Четверг Пятница Суббота Воскресенье") DO Set "DWeek=%%i" FOR /F "tokens=%DWeek% delims= " %%i IN ("Понедельник Вторник Среда Четверг Пятница Суббота Воскресенье") DO Set "DWeek=%DWeek%_%%i" FOR /F "tokens=%DWeek% delims= " %%i IN ("Понедельник Вторник Среда Четверг Пятница Суббота Воскресенье") DO Set "DWeek=%%i" rem FOR /F "tokens=%DWeek% delims= " %%i IN ("Понедельник Вторник Среда Четверг Пятница Суббота Воскресенье") DO Set "DWeek=%DWeek%_%%i" Цитата xan08:
Я уже писАл, что использовал известные приёмы для работы с датами
Я взял готовые коды, с которыми когда-то давно столкнулся, не берусь вспомнить, где. Оформил их в виде процедур, чтобы использовать по мере надобности и не изобретать велосипед. Можно найти исходные формулы, но лень.
Вот пример использования этих процедур @Echo Off cls Call :JdayGcal 01 01 2019 "N1" Call :JdayGcal 05 07 2019 "NX" Set /A NY=%NX%-%N1%+1 Echo Номер дня в году %NY% Call :NdayInWeek 05 07 2019 "NW" Echo Номер дня недели %NW% Pause GoTo :Eof rem Юлианский день по григорианскому календарю дд мм гггг имя_переменной :JdayGcal SetLocal Set "D=0%1" &Set "M=0%2" Set /A D=1%D:~-2%-100,M=1%M:~-2%-100 Set /A A=(14-%M%)/12, Y=%3+4800-A, M=%M%+12*A-3 EndLocal &Set /A %~4=(%D%+(153*%M%+2)/5+365*%Y%+%Y%/4-%Y%/100+%Y%/400-32045) Exit /B rem Номер дня в неделе дд мм гггг имя_переменной :NdayInWeek SetLocal Set "D=0%1" &Set "M=0%2" Set /A D=1%D:~-2%-100,M=1%M:~-2%-100 Set /A i=(%3-1901)*365 + (%3-1901)/4 + %D% + (!(%3 %% 4))*(!((%M%-3)^&16)) EndLocal &Set /A %~4=(%i%+(%M%-1)*30+2*(!((%M%-7)^&16))-1+((65611044^>^>(2*%M%))^&3))%%7+1 Exit /B |
||
------- Последний раз редактировалось megaloman, 05-07-2019 в 16:36. Отправлено: 11:28, 05-07-2019 | #7 |
Crazy Сообщения: 1235
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
powershell |
|
------- Отправлено: 11:53, 05-07-2019 | #8 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
![]() |
|
Отправлено: 12:15, 05-07-2019 | #9 |
Crazy Сообщения: 1235
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Цитата Iska:
![]() |
||
------- Отправлено: 12:40, 05-07-2019 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Создание папок исходя из дат создания файлов и перемещение их в эти папки | mezzin | Скриптовые языки администрирования Windows | 13 | 25-01-2018 18:38 | |
CMD/BAT - Создание папок с подпапками и перемещение файлов в конечную подпапку | alekseivasilyev70 | Скриптовые языки администрирования Windows | 1 | 13-09-2017 22:34 | |
CMD/BAT - [решено] Создание папок на основе имен файлов и перемещение файлов в эти папки | mezzin | Скриптовые языки администрирования Windows | 4 | 10-12-2016 21:11 | |
CMD/BAT - [решено] перемещение файлов , последних по имени | Alexander_88 | Скриптовые языки администрирования Windows | 5 | 21-08-2014 13:39 | |
CMD/BAT - [решено] Создание папок по дате получения файлов и перемещение в них файлов | KamikadZZe | Скриптовые языки администрирования Windows | 1 | 01-09-2011 14:15 |
|