Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

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

Ответить
Настройки темы
CMD/BAT - [решено] удалить все папки в директории, которые меньше текущего месяца

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


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

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


Здравствуйте.
Возник вопрос по решению вот такой задачи:

Структура папок:
Код: Выделить весь код
accounts
	name1
		inbox
			2011_10_12
			2011_10_13
		outbox
			2011_10_12
			2011_10_13
		logs
	name2
		inbox
			2011_10_12
			2011_10_13
		outbox
			2011_10_12
			2011_10_13
		logs
Необходимо удалить все папки в директории accounts\<name>\<inbox,outbox> которые меньше текущего месяца.
т.е. если мы запустили файл 30.10.2011 то удалить все папки кроме: 2011_10_*

Пока реализовал только получение списка папок, не получается создать условие на удаление.
Код: Выделить весь код
set %Dir%=D:\tmp
set CURDATE=%DATE%
rem %CURDATE:~6,4% - год
rem %CURDATE:~3,2% - месяц

for /d %%i in (%Dir%\accounts\*) do (
for /d %%a in (%%i\inbox\*, %%i\outbox\*) do (echo %%a))
В данном случае %%a содержит полный путь к папке+название папки

Отправлено: 16:46, 07-10-2011

 

Аватара для zero55

Ветеран


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

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


Попробуйте на PowerShell.
вот тут есть секция и еще примеры.

$Path = "C:\temp"
$Days = "-30"
$CurrentDate = Get-Date
$OldDate = $CurrentDate.AddDays($Days)
Get-ChildItem $Path -Recuse | Where-Object { $_.LastWriteTime -lt $OldDate } | Remove-Item

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

Отправлено: 20:25, 08-10-2011 | #2



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

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


Ветеран


Contributor


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

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


Код: Выделить весь код
@echo off
rem Если формат даты в системе дд.мм.гггг
rem и формат поддиректорий гггг_мм_дд

Set Where=D:\accounts

Set Now=%Date:~6,4%%Date:~3,2%

FOR %%f IN ("Name1" "Name2") DO FOR %%b IN ("Inbox" "Outbox") DO FOR /D %%t IN ("%Where%\%%~f\%%~b\20??_??_??.") DO Call :DelDir "%%t"
GoTo :Eof

:DelDir
Set This=%~nx1
Set This=%This:~0,4%%This:~5,2%
If %This% LSS %Now% Rd /S /Q %1
Код: Выделить весь код
@echo off
rem Если формат даты в системе дд.мм.гггг
rem и формат поддиректорий гггг_мм_дд

Set Where=D:\accounts

Set Now=%Date:~6,4%%Date:~3,2%

Call :Account "Name1"
Call :Account "Name2"
Call :Account "Name3"
Call :Account "Name4"

GoTo :Eof

:Account
  FOR %%b IN ("Inbox" "Outbox") DO FOR /D %%t IN ("%Where%\%~1\%%~b\20??_??_??.") DO Call :DelDir "%%t"
GoTo :Eof

:DelDir
  Set This=%~nx1
  Set This=%This:~0,4%%This:~5,2%
  If %This% LSS %Now% Rd /S /Q %1
Код: Выделить весь код
@echo off
rem Если формат даты в системе дд.мм.гггг
rem и формат поддиректорий гггг_мм_дд
rem и поддректории с указанными именами только в InBox и OutBox

Set Where=D:\accounts

Set Now=%Date:~6,4%%Date:~3,2%
FOR /F "usebackq delims=" %%t IN (`Dir /S /A:D /B "%Where%\20??_??_??."`) DO Call :DelDir "%%t"
GoTo :Eof

:DelDir
  Set This=%~nx1
  Set This=%This:~0,4%%This:~5,2%
  If %This% LSS %Now% Rd /S /Q %1

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


Последний раз редактировалось megaloman, 08-10-2011 в 23:50.

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

Отправлено: 23:13, 08-10-2011 | #3


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


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

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


Спасибо всем.
Использовал третий пример от megaloman. Первые два не подошли, т.к. имена аккаунтов добаляются и меняются часто.
Немного дополнил пример. Вот что получилось:

Код: Выделить весь код
set %Dir%=D:\tmp

For /d %%i in (%Dir%\accounts\*) do (
FOR /F "usebackq delims=" %%t IN (`Dir /S /A:D /B "%%i\20??_??_??."`) DO (
Call :DelDir "%%t"
echo %%t))

GoTo :Eof

:DelDir
  Set This=%~nx1
  Set This=%This:~0,4%%This:~5,2%
  If %This% LSS %Now% Rd /S /Q %1
Задача решена. Еще раз спасибо.

Отправлено: 10:46, 10-10-2011 | #4


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


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

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


Ваше решение удалит все папки удовлетворяющие условию в директории %Dir%\accounts\*, а мое все директории в папках %Dir%\accounts\<name>\*

Просто бывают случаи когда программисты или тех.поддержа могут скопировать историю в папку accounts и не хотелось бы их затирать.
По хорошему вообще бы искать только в "%Dir%\accounts\<name>\Inbox" и "%Dir%\accounts\<name>\Outbox"
Можно попробовать так:

Код: Выделить весь код
For /d %%i in (%Dir%\accounts\*) do (
FOR /F "usebackq delims=" %%t IN (`Dir /S /A:D /B "%%i\Inbox\20??_??_??."`, `Dir /S /A:D /B "%%i\Outbox\20??_??_??."`) DO (
Call :DelDir "%%t"
echo %%t))
но не уверен что сработает

Отправлено: 10:26, 11-10-2011 | #5


Ветеран


Contributor


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

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


Код: Выделить весь код
@echo off
rem Если формат даты в системе дд.мм.гггг
rem и формат поддиректорий гггг_мм_дд
rem во всех поддиректориях InBox OutBox

Set Where=D:\Delete\Accounts

Set Now=%Date:~6,4%%Date:~3,2%

FOR /F "usebackq delims=" %%w IN (`Dir /S /A:D /B "%Where%\InBox." "%Where%\OutBox."`) Do FOR /F "usebackq delims=" %%t IN (`Dir /A:D /B "%%w\20??_??_??."`) DO Call :DelDir "%%w\%%t"
GoTo :Eof
Проверено, работает

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

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

Отправлено: 00:43, 12-10-2011 | #6



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Как удалить из папки все файлы определенного размера? Alex_smo Скриптовые языки администрирования Windows 6 29-07-2014 19:50
Любой язык - Нужно быстро (!) добавить/удалить строку во все файлы указанной директории Possessed Скриптовые языки администрирования Windows 6 04-10-2011 22:29
CMD/BAT - [решено] Как удалить все папки кроме папок с названием длиной в 14 символов? yaoleg2 Скриптовые языки администрирования Windows 9 26-03-2011 03:49
CMD/BAT - [решено] Удалить все файлы из папки кроме нужных Sirimika Скриптовые языки администрирования Windows 16 12-11-2010 10:33
Интерфейс - [решено] Нужно отобразить все пустые папки в директории Третий Microsoft Windows 7 1 24-08-2009 22:17




 
Переход