Remmi
@Remmi

BAT-файл: как удалить папки (файлы) до определенной даты?

Добрый день всем читающим!

Есть каталог D:\backup с набором подкаталогов, имеющих название по дате создания.
Каталоги в D:\backup:
2015.06.20
2015.06.21
2015.06.22
...
2015.06.29


Мне понадобилось сделать так, чтобы из набора этих папок остались последние три.

Нашел код, прибавляющий N дней к текущей дате (при вводе -N отсчёт по дням идёт назад):
: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 yyyymmddborder=%yyyy%.%mm:~-2%.%dd:~-2%


На выходе при вызове функции имею дату (название папки), до которой нужно удалять папки:
call :FromNow -3
echo %yyyymmddborder%
> 2015.06.26


Осталось перебрать папки в цикле в обратном порядке, и начать удалять, когда будет встречено нужное название. В обычном виде отлично подходит FOR:
for /d %%B in (D:\backup\*) do echo %%B
Однако не могу разобраться, как сделать перебор каталогов в обратном порядке.

Вопросы:
1. Правилен ли путь с сортировкой в обратном порядке - и как его сделать?
2. Или есть другой, более простой вариант решения этой задачи?

Заранее благодарю за помощь.
  • Вопрос задан
  • 4686 просмотров
Пригласить эксперта
Ответы на вопрос 2
@yellowmew
Cloud infrastructure, monitoring engineer. SRE
А почему не сгенерить собственно названия папок соответственно последним трем дням и если название имеющейся папки не входит в эту троицу - удалять.
Или я неправильно понял и последняя дата неизвестна?
Решение задачи на powershell :
[System.Collections.ArrayList]$a = (Get-ChildItem d:\test\data -Directory | sort Name -Descending)
$a.RemoveRange(0,3)
ForEach ($v in $a) {Remove-Item d:\test\data\$v}
Ответ написан
@barmaglod
Обратный порядок вывода можно сделать с помощью команды dir с ключом /O:-D.
Например:
for /f %%i in ('dir D:\backup\* /b /a:d /o:-d /t:c') do echo %%i
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы