Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.54/57: Рейтинг темы: голосов - 57, средняя оценка - 4.54
Ches.spb
1 / 1 / 0
Регистрация: 12.11.2010
Сообщений: 51
1

Удаление папок по дате в их именах

03.06.2011, 15:31. Просмотров 10615. Ответов 25
Метки нет (Все метки)

Доброго времени суток!
У меня появилась проблема по удаление папок по дате.
Суть:
Есть папка C:\reserv, куда после запуска bat-ника копируются папки с документами, в имени папок добавляется дата например Word_27.05.2011, понятно что в папке накопиться очень много копированных папок и есть смысл удалять папки которые созданы не более 3-ех дней назад.Т.о. батник должен считать сегодняшнюю дату, отнять 3 дня и удалить папки у которых дата записанная в имени меньше.
Это все до чего я дошел:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
set todaydate2=%date:~2% 
set /a todaydate3=%date:~3%
set /a todaydate=%date:~0%
set todaydate4=%date:~5%
set /a s=%todaydate%-3
 
if  not %s% LEQ 0 (goto a) else ( goto :b )
 
:a
md C:\prov\%s%%todaydate2%
goto exit
:b
set /a s2=31%s% 
set /a s3= %todaydate3%-1 
if %todaydate3% GTR 9 (md C:\prov\%s2%.%s3%%todaydate4%) else (md C:\prov\%s2%.0%s3%%todaydate4%)
pause
goto exit
:exit 
exit
Здесь батник создает папки а мне нужно чтобы удалял все папки которые меньше, полученной после вычитания 3 дней, даты. Метка :b делает тоже самое только она еще месяц на месяц назад уходит.
Надеюсь объяснил понятно.
Заранее спасибо!
P.s. Сорри за грамм и орф ошибки, если таковые есть.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2011, 15:31
Ответы с готовыми решениями:

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

Кириллица в именах папок при работе с psexec
Здравствуйте. Подскажите как исправить следующее: Захожу в CMD удалённой машины с помощью psexec:...

Расчёт дат для их использования в именах файлов и папок при переименовании
День добрый!!! мне нужна помощь, подскажите как написать БАТНИК, что бы можно было копировать одну...

Замена в именах папок определённых русских букв сходными по написанию английскими
Много искал в интернете, но так и не нашёл ответа на свой вопрос. Вот моя проблема: в папке...

Наличие кириллических символов в именах папок и файлов воспринимается как синтаксическая ошибка
Помогите пожалуйста решить следующую проблему: Есть локальный компьютер (Windows 7x64), в нем...

25
atributz
833 / 347 / 12
Регистрация: 04.10.2009
Сообщений: 589
03.06.2011, 20:03 2
Есть пример функции которая отсчитывает на требуемое число дней назад/вперед.
Попробуйте пока сами разобраться.

Добавлено через 3 часа 43 минуты
Ошибочка, не проверял эту функцию что то не работает она.
1
Ches.spb
1 / 1 / 0
Регистрация: 12.11.2010
Сообщений: 51
03.06.2011, 23:44  [ТС] 3
Спасибо за ответ!
Извините меня я наверно не так объяснил, у меня запара не с датой, а запара с удалением как сделать так чтобы батник считывал имя папки? пойдем из далека
0
atributz
833 / 347 / 12
Регистрация: 04.10.2009
Сообщений: 589
04.06.2011, 01:08 4
Рабочая версия
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@echo off
set main_dir=c:\reserv
call :FromNow -3
for /f "delims=" %%i in ('dir "%main_dir%" /b /ad') do call :p "%%i"
exit
 
:p
setLocal
set dir_date=%~1
set dir_date=%dir_date:~-10%
if %dir_date:~-4% lss %ddmmyyyy:~-4% goto delete
if %dir_date:~-4% gtr %ddmmyyyy:~-4% goto no_delete
if %dir_date:~3,2% lss %ddmmyyyy:~3,2% goto delete
if %dir_date:~3,2% gtr %ddmmyyyy:~3,2% goto no_delete
if %dir_date:~,2% lss %ddmmyyyy:~,2% goto delete
goto no_delete
:delete
rd /s /q "%main_dir%\%~1"
:no_delete
EndLocal
exit /b
 
:FromNow
setLocal
set now=%date%
set /a yyyy=%now:~-4%
set /a mm=%now:~3,2%
set /a dd=%now:~,2%
set /a JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
set /a L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
set /a L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
set /a J=J+2-12*L,I=100*(N-49)+I+L
set /a yyyy=I,mm=100+J,dd=100+K
EndLocal& set ddmmyyyy=%dd:~-2%.%mm:~-2%.%yyyy%
exit /b
1
04.06.2011, 01:08
Ches.spb
1 / 1 / 0
Регистрация: 12.11.2010
Сообщений: 51
04.06.2011, 17:58  [ТС] 5
Ты гений!
Только что то я не понял как ты удаление сделал Объясни сам алгоритм если не трудно?
0
atributz
833 / 347 / 12
Регистрация: 04.10.2009
Сообщений: 589
05.06.2011, 18:31 6
Сначала в ddmmyyyy расчитывается дата -3 дня от текущей.
Код
for /f "delims=" %%i in ('dir "%main_dir%" /b /ad') do call :p "%%i"
выдает нам название каждой папки по одной и с этим названием вызывается основная функция p
где из названия берутся последние символы даты и пишем их в dir_date.
там где куча if сравнивем год месяц и дату если меньше то удаляем rd /s /q "%main_dir%\%~1"
1
atributz
833 / 347 / 12
Регистрация: 04.10.2009
Сообщений: 589
01.09.2011, 03:57 7
заметил недочеты в функции Fromnow
если день или месяц 8 или 9 то работает неправильно
нужно так
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@echo off
::Показать дату, которая была 11 дней назад
call :fromnow -11
echo %ddmmyyyy%
pause>nul
goto :eof
 
:FromNow
setLocal
set now=%date%
set /a yyyy=%now:~-4%
set /a mm=1%now:~3,2%-100
set /a dd=1%now:~,2%-100
set /a JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
set /a L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
set /a L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
set /a J=J+2-12*L,I=100*(N-49)+I+L
set /a yyyy=I,mm=100+J,dd=100+K
EndLocal& set ddmmyyyy=%dd:~-2%.%mm:~-2%.%yyyy%
exit /b
2
Ilya39
0 / 0 / 0
Регистрация: 05.08.2012
Сообщений: 1
08.08.2012, 23:44 8
А что поменять для даты вида yyyymmdd?
0
Dragokas
Эксперт WindowsАвтор FAQ
17087 / 7142 / 861
Регистрация: 25.12.2011
Сообщений: 10,951
Записей в блоге: 16
08.08.2012, 23:58 9
Bash
12
EndLocal& set yyyymmdd=%yyyy%.%mm:~-2%.%dd:~-2%
0
Xordman
0 / 0 / 0
Регистрация: 10.11.2016
Сообщений: 4
10.11.2016, 13:24 10
Добрый день,
Сразу прошу прощения за то что поднимаю такую старую тему, но у меня проблема не могу подстроить данный скрипт под свой формат,

У меня программа "Remote Backup" делает копии видео в каталог "C:\RecordFile" и в ней создает подкаталоги с названием в формате yyymmdd без точек, и собственно данный скрипт удаляет все что не подпадает под dd.mm.yyyy

Можете помочь?
0
Dragokas
Эксперт WindowsАвтор FAQ
17087 / 7142 / 861
Регистрация: 25.12.2011
Сообщений: 10,951
Записей в блоге: 16
10.11.2016, 16:37 11
Цитата Сообщение от Xordman Посмотреть сообщение
yyymmdd
3 знака для года?
Может все-таки 4?

Прямо над вами пост с ответом, только точки удалить.
0
Xordman
0 / 0 / 0
Регистрация: 10.11.2016
Сообщений: 4
10.11.2016, 16:46 12
Цитата Сообщение от Dragokas Посмотреть сообщение
Сообщение от Xordman
yyymmdd
3 знака для года?
Может все-таки 4?
Прямо над вами пост с ответом, только точки удалить.
Спасибо за ответ, но
Цитата Сообщение от Dragokas Посмотреть сообщение
EndLocal& set yyyymmdd=%yyyy%.%mm:~-2%.%dd:~-2%
не подходит

А yyymmdd опечатка, я хотел написать yyyymmdd, для уточнения у меня папки называются
20161101
20161102
20161103
ну и так далее
Предварительно я ознакомился с темой и попробовал ваши варианты.

Добавлено через 1 минуту
Цитата Сообщение от Dragokas Посмотреть сообщение
только точки удалить
Тоже кстати интуитивно додумался, но не помогло.
0
Dragokas
Эксперт WindowsАвтор FAQ
17087 / 7142 / 861
Регистрация: 25.12.2011
Сообщений: 10,951
Записей в блоге: 16
10.11.2016, 16:48 13
Может всё-таки заново озвучите полное задание, а то 4 года прошло теме.
Или вообще в новой теме.
0
Xordman
0 / 0 / 0
Регистрация: 10.11.2016
Сообщений: 4
10.11.2016, 17:01 14
Цитата Сообщение от Dragokas Посмотреть сообщение
Может всё-таки заново озвучите полное задание, а то 4 года прошло теме.
Есть папка C:\RecordFile в которой есть папки с видео (копии видео наблюдения). они создаются каждый день и удалять их приходится в ручную, программа которая это делает, очень не функциональная, и выставить в ней удаления старых записей нельзя, я пробовал использовать программы для удаления по атрибутам, но эта программа, каждый день меняет атрибуты ( создание, изменения).

Выход в том что бы применить скрипт который используется тут, но под мой тип названия а именно
Цитата Сообщение от Xordman Посмотреть сообщение
20161101
20161102
20161103
так-как то что тут есть работает с названиями типа
10.11.2016
11.11.2016
и мои папки соответственно удаляет.
0
Dragokas
Эксперт WindowsАвтор FAQ
17087 / 7142 / 861
Регистрация: 25.12.2011
Сообщений: 10,951
Записей в блоге: 16
10.11.2016, 18:18 15
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@echo off
SetLocal EnableExtensions
 
:: считать свежими папки, созданные за последние: ... дней
set Fresh=3
:: папка, с папками вида yyyymmdd для удаления
set "Folder=c:\temp"
 
For /L %%C in (0, -1, -%Fresh%) do call :FromNow %%C& call set ""%%ret%%"=*"
 
For /F "delims=" %%a in ('dir /b /ad "%Folder%\*"') do if not defined "%%a" echo rd /s /q "%Folder%\%%a"
pause
goto :eof
 
:FromNow
setLocal
set now=%date%
set /a yyyy=%now:~-4%
set /a mm=1%now:~3,2%-100
set /a dd=1%now:~,2%-100
set /a JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
set /a L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
set /a L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
set /a J=J+2-12*L,I=100*(N-49)+I+L
set /a yyyy=I,mm=100+J,dd=100+K
EndLocal& set ret=%yyyy%%mm:~-2%%dd:~-2%
exit /b
После теста, для боевого запуска удалить "echo" из строки № 11.
1
Xordman
0 / 0 / 0
Регистрация: 10.11.2016
Сообщений: 4
10.11.2016, 18:27 16
Огромное Вам спасибо!
Единственное что, я еще убрал из 12 "pause", что бы оставить скрипт в планировку.

Спасибо!
0
alpap
2172 / 1467 / 496
Регистрация: 26.04.2015
Сообщений: 4,988
10.11.2016, 22:07 17
Добавлю свой алгоритм по определению максимальной даты в имени вида dd.MM.yyyy, но только за год, т.е. год должен быть в именах одинаковый, может кому пригодится:
Для папок
Windows Batch file
1
2
3
4
5
6
7
8
@echo off
set "d=papka"
pushd "%d%" 
 for /f "tokens=2,3 delims=." %%a in ('dir/ad/b^|sort/+3') do set MM=%%a& set yyyy=%%b
 for /f "delims=." %%a in ('dir/ad/b^|findstr/rc:"\.%MM%\."') do set dd=%%a
 echo %dd%.%MM%.%yyyy%
popd
pause
Для файлов
Windows Batch file
1
2
3
4
5
6
7
8
@echo off
set "d=papka"& set "rs=txt"
pushd "%d%" 
 for /f "tokens=2,3 delims=." %%a in ('dir/a-d/b "*.%rs%"^|sort/+3') do set MM=%%a& set yyyy=%%b
 for /f "delims=." %%a in ('dir/a-d/b "*.%rs%"^|findstr/rc:"\.%MM%\."') do set dd=%%a
 echo %dd%.%MM%.%yyyy%
popd
pause
0
Dragokas
10.11.2016, 22:44
  #18

Не по теме:


alpap, так нужна не максимальная, а удаление всех, кроме свежих (за несколько дней).

0
alpap
10.11.2016, 22:52
  #19

Не по теме:

Dragokas,
я видел, сохранить хочеться, тема подходящая, тем более из максимальной можно сделать уже нужную, главная проблема в правильной сортировке, эту максимальную дату я могу, например PSу подсунуть и одной маленькой строчкой получу верхний потолок, ниже которого все можно грохать.

0
Dragokas
10.11.2016, 23:12     Удаление папок по дате в их именах
  #20

Не по теме:


alpap, а если "максимальная" папка - это не та что с датой, а какая-то другая?
Получится, что грохнется нужная, если брать отсчёт от нее.

0
10.11.2016, 23:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2016, 23:12
Привет! Вот еще темы с ответами:

Преобразование файлов и перенос их в папки(названия папок содержится в именах файлов)
Доброй ночи! Тяжело быть глупой, помогите автоматизировать (пишу полную задачу, но если это...

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

Копирование логов из различных, по дате, папок
Добрый день! Столкнулись с задачей: Есть папки с логами, вида:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru