Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Создание папок по имени и перемещение файлов

Ответить
Настройки темы
Любой язык - [решено] Создание папок по имени и перемещение файлов

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


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

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


Изменения
Автор: xan08
Дата: 03-07-2019
Добрый день. Помогите алгоритмом решения, примером, готовым решением. Задача обстоит так следующим образом.
В папке 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

 

Ветеран


Contributor


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

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


Цитата xan08:
D_Пятница_56_my-files_backup.2019-06-09-10-00_00 »
Как должна называться папка, куда надо переместить этот файл?
2019-06-09 (если это гггг-мм-дд) это воскресенье 23 недели.

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


Отправлено: 17:22, 03-07-2019 | #2



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

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


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


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

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


Цитата megaloman:
Как должна называться папка, куда надо переместить этот файл?
2019-06-09 (если это гггг-мм-дд) это воскресенье 23 недели. »
Извиняюсь. Не тот день указал. В данном примере файл должен переместиться в папку D:\backup\Неделя 23\D_воскресенье

Отправлено: 19:16, 03-07-2019 | #3


Ветеран


Contributor


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

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


Ветеран


Contributor


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

Профиль | Отправить 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
Забыл напомнить: батники сохранять в 866 кодировке

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


Последний раз редактировалось megaloman, 04-07-2019 в 11:21.

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

Отправлено: 08:28, 04-07-2019 | #5


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


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

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


Цитата megaloman:
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 »
Спасибо megaloman! Первый скрипт устраивает полностью, за исключением номера дня в названии папки D_5_Пятница, можно ли это поправить? Не могли бы вы расписать кратенько, что происходит в этой секции? 1%D:~-2% гуглиться плохо, был бы признателен если ткнете ссылкой где можно почитать.
Цитата megaloman:
xan08, Если в имени Ваших файлов маска именно такая, как Вы указали, то есть:
D_Имядня_номернедели_траляляляля, то решение многократно проще: »
Спасибо, возможно получится изменить формат имени в бэкапе, а так в названии нет номера недели, это что то вроде порядкового номера.

Отправлено: 06:00, 05-07-2019 | #6


Ветеран


Contributor


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

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


Цитата xan08:
Первый скрипт устраивает полностью, за исключением номера дня в названии папки D_5_Пятница, можно ли это поправить? »
В коде всё уже содержится. Минимальная поправка: было
Код: Выделить весь код
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"
Кстати, оказывается понятие "номер недели в году" не так просто, как я по наивности полагал. Я считаю, что первый день недели - это неделя с 1 января. Если Вас это устраивает, то всё в порядке.
Цитата 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


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата megaloman:
Кстати, оказывается понятие "номер недели в году" не так просто, как я по наивности полагал. »
Зависит от инструмента...
powershell
Код: Выделить весь код
get-date -uf %V #number of 01-53
get-date -uf %U #number of 00-52

-------
scio me nihil scire. Ѫ


Отправлено: 11:53, 05-07-2019 | #8


Ветеран


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

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


Цитата YuS_2:
Зависит от инструмента... »
Зависит от региона . Потому во многих инструментах и есть параметр, какую именно неделю следует трактовать, как первую в году.

Отправлено: 12:15, 05-07-2019 | #9


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Iska:
Зависит от региона »
Никак не зависит. Существует международный стандарт ISO 8601, кроме того ГОСТ ИСО 8601 (межгосударственный стандарт), которые определяют четко и ясно, какая неделя считается первой в году, а какая крайней.

Цитата Iska:
Потому во многих инструментах и есть параметр, какую именно неделю следует трактовать, как первую в году. »
Самодеятельность чистейшей воды, если существует.

-------
scio me nihil scire. Ѫ


Отправлено: 12:40, 05-07-2019 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Создание папок по имени и перемещение файлов

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход