Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] удалить все папки в директории, которые меньше текущего месяца (http://forum.oszone.net/showthread.php?t=217374)

SnakeSel 07-10-2011 16:46 1768106

удалить все папки в директории, которые меньше текущего месяца
 
Здравствуйте.
Возник вопрос по решению вот такой задачи:

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

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 1768943

Попробуйте на 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 08-10-2011 23:13 1769066

Код:

@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 1769914

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

Ваше решение удалит все папки удовлетворяющие условию в директории %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 1771486

Код:

@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

Проверено, работает


Время: 14:13.

Время: 14:13.
© OSzone.net 2001-