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

Ответить
Аватара пользователя
SnakeSel

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

Сообщение SnakeSel »

Здравствуйте.

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



Структура папок:



Код:

Код: Выделить всё

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\\ которые меньше текущего месяца.

т.е. если мы запустили файл 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 содержит полный путь к папке+название папки
Аватара пользователя
zero55

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

Сообщение zero55 »

Попробуйте на PowerShell.

вот
тут
есть секция и еще примеры.



$Path = "C:\temp"

$Days = "-30"

$CurrentDate = Get-Date

$OldDate = $CurrentDate.AddDays($Days)

Get-ChildItem $Path -Recuse | Where-Object { $_.LastWriteTime -lt $OldDate } | Remove-Item



Возможно она вам подойдет.
Аватара пользователя
megaloman

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

Сообщение megaloman »

Код:

Код: Выделить всё

@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
Аватара пользователя
SnakeSel

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

Сообщение SnakeSel »

Спасибо всем.

Использовал третий пример от 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

Задача решена. Еще раз спасибо.
Аватара пользователя
SnakeSel

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

Сообщение SnakeSel »

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



Просто бывают случаи когда программисты или тех.поддержа могут скопировать историю в папку accounts и не хотелось бы их затирать.

По хорошему вообще бы искать только в "%Dir%\accounts\\Inbox" и "%Dir%\accounts\\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))

но не уверен что сработает
Аватара пользователя
megaloman

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

Сообщение megaloman »

Код:

Код: Выделить всё

@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

Проверено, работает
Ответить

Вернуться в «Скриптовые языки администрирования Windows»