удалить все папки в директории, которые меньше текущего месяца
Здравствуйте.
Возник вопрос по решению вот такой задачи:
Структура папок:
Код:
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 содержит полный путь к папке+название папки
|
Попробуйте на PowerShell.
вот тут есть секция и еще примеры.
$Path = "C:\temp"
$Days = "-30"
$CurrentDate = Get-Date
$OldDate = $CurrentDate.AddDays($Days)
Get-ChildItem $Path -Recuse | Where-Object { $_.LastWriteTime -lt $OldDate } | Remove-Item
Возможно она вам подойдет.
|
Код:
@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. Первые два не подошли, т.к. имена аккаунтов добаляются и меняются часто.
Немного дополнил пример. Вот что получилось:
Код:
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
Задача решена. Еще раз спасибо.
|
Ваше решение удалит все папки удовлетворяющие условию в директории %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))
но не уверен что сработает
|
Код:
@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.
© OSzone.net 2001-