Войти

Показать полную графическую версию : [решено] удалить все папки в директории, которые меньше текущего месяца


SnakeSel
07-10-2011, 16:46
Здравствуйте.
Возник вопрос по решению вот такой задачи:

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

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

zero55
08-10-2011, 20:25
Попробуйте на PowerShell.
вот тут (http://blog.wadmin.ru/2011/09/powershell-lessons-working-with-files-and-folders/) есть секция и еще примеры.

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

Возможно она вам подойдет.

megaloman
08-10-2011, 23:13
@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
10-10-2011, 10:46
Спасибо всем.
Использовал третий пример от 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
11-10-2011, 10:26
Ваше решение удалит все папки удовлетворяющие условию в директории %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))
но не уверен что сработает

megaloman
12-10-2011, 00:43
@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
Проверено, работает




© OSzone.net 2001-2012