|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 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 Сообщения: 1234
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
powershell |
|
|
------- Отправлено: 11:53, 05-07-2019 | #8 |
|
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
. Потому во многих инструментах и есть параметр, какую именно неделю следует трактовать, как первую в году. |
|
|
Отправлено: 12:15, 05-07-2019 | #9 |
|
Crazy Сообщения: 1234
|
Профиль | Отправить 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 | |
|