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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Windows Server 2012/2012 R2 (http://forum.oszone.net/forumdisplay.php?f=117)
-   -   [решено] Удаление файлов старше 100 дней (http://forum.oszone.net/showthread.php?t=283254)

DJ Mogarych 06-06-2014 15:09 2360767

Удаление файлов старше 100 дней
 
Добрый день, дорогие коллеги!

Подскажите, как лучше реализовать удаление файлов старше 100 дней в неком каталоге?
Есть ли встроенные средства с графической оболочкой, или это достигается только скриптами?

Iska 06-06-2014 15:45 2360785

Цитата:

Цитата DJ Mogarych
Есть ли встроенные средства с графической оболочкой »

Может уже и есть. На WSH устроит?

ratibor79 06-06-2014 15:50 2360787

DJ Mogarych,
я вот так вот реализовывал через планировщик. Может немного криво, за то работает.

Очистка некой папки ( EXCHANGE ). Файлы старше 60 дней помещеються в папку !НА УДАЛЕНИЕ!, а файлы старше 70 дней удаляются из !НА УДАЛЕНИЕ!? формирование отчёта и отправка его на почту.

Код:

# переменная даты
$Date = Get-Date -Format yyyy-MM-dd

#Запускаем запись лога
Start-Transcript -path "D:\DATA\PUBLIC\DEPT\IT\LOGs\ClearFolderLog_$Date.txt"

# Переменные конечной папки
$TargetFolder = "D:\DATA\PUBLIC\( ExCHANGE )"
# переменная папки временного содержания
$ForDelete = "D:\DATA\PUBLIC\( ExCHANGE )\!НА УДАЛЕНИЕ!"
# переменная исключений
$exclude = @("*!!!*", "!НА УДАЛЕНИЕ!", "*.lnk")
# переменная, чтобы исключить обработку папок и файлов перечисленных в исключениях

# Переход в исходную папку
####cd "$TargetFolder"

$Target = Get-ChildItem -Path $TargetFolder -Exclude $exclude
#Переменные времени
$minus60 = (Get-Date).AddDays(-60)
$minus70 = (Get-Date).AddDays(-70)

Write-Host ""
Write-Host "====================== Перемещение в папку $ForDelete ==========================="

# Перемещение объектов из целевой папки старше 60 дней в папку временного содержания
$ListObjects = (Get-ChildItem -Path $Target -Recurse | `
    Where-Object {(!$_.PSisContainer) -and ($_.lastwritetime -lt $minus60) -and ($_.CreationTime -lt $minus60)}).FullName
Foreach ($Objects in $ListObjects) {
    Write-Host "Перемещение объекта $Objects в папку $ForDelete" -foregroundcolor "Yellow"; `
    Move-Item -Path $Objects -Destination $ForDelete -Force
    }

Write-Host ""
Write-Host "================= Удаление объектов из папки $ForDelete =========================="

# Удаление объектов из папки временного содержания старше 70 дней
$ListObjDel = (Get-ChildItem -Path $ForDelete -Recurse |`
    Where-Object {($_.lastwritetime -lt $minus70) -and ($_.CreationTime -lt $minus70)}).FullName
ForEach ($ObjDel in $ListObjDel) {
        Write-Host "Удаление обекта $ObjDel" -foregroundcolor "Green"; `
    Remove-Item -Path $ObjDel -Recurse -Force
        }
       
#останавливаем запись лога
Stop-Transcript

# ==================================================================================

# удаление пустых папок из целевой папки

Get-ChildItem -Path $TargetFolder -Exclude $exclude -Recurse | Where-Object {$_.psiscontainer -eq “true”} | `
    ForEach {`
        if (Get-Childitem $_.FullName) {} else {Remove-Item $_.FullName
        }
    }

# ============================ ОТПРАВКА ОТЧЕТА ПО пОЧТЕ ===========================

# Ищем файлы последние за сутки
$CurrentDate = Get-Date -UFormat "%Y-%m-%d"
# $CurrentDate
$ListFile = Get-ChildItem "D:\DATA\PUBLIC\DEPT\IT\LOGs\*" -include *.txt -recurse | Where-Object{ $_.LastWriteTime -gt $CurrentDate }
#$ListFile

# Создаем почтовое сообщение
$mail = New-Object System.Net.Mail.MailMessage

# Устанавливаем соединение
$mail.From = New-Object System.Net.Mail.MailAddress("noreply@domain.kz")
$mail.To.Add("support@domain.kz" )

# Устанавливаем тему сообщения
$mail.Subject = "Repport Clear ( ExCHANGE ) folder";
# Создаем тело сообщения из файла
$mail.Body = "Отчет об очистке папки \\domain.kz\Shared\PUBLIC\( ExCHANGE )\"

# Приаттачиваем файлы
foreach ($File in ($ListFile))
    {
        $Attachment = New-Object System.Net.Mail.Attachment ($File)
        $mail.Attachments.Add($Attachment)
    }

# Создаем почтовое сообщение
$smtp = New-Object System.Net.Mail.SmtpClient
# Указываем хост через который будем отправлять
$smtp.host = "mail.domain.kz"

# Задаем пользователя от имени которого будет происходить отправка
$Credentials = new-object System.Net.networkCredential
$Credentials.domain = "DOMAIN"
$Credentials.UserName = "noreply"
$Credentials.Password = "Service@cc0unt"
$smtp.Credentials = $Credentials

# Отправка
$smtp.Send($mail)

ЕСЛИ КТО УЛУЧШИТ СКРИПТ БУДУ БЛАГОДАРЕН.

WindowsNT 06-06-2014 15:52 2360789

Может, это как-то поможет: http://technet.microsoft.com/en-us/l.../dd759233.aspx

Iska 06-06-2014 16:41 2360811

Ну, вот и нашлось ;).

DJ Mogarych 06-06-2014 22:13 2360950

Дорогие коллеги, я вам крайне благодарен!
WindowsNT, а ведь я теперь припоминаю из микрософтовских экзаменов про File Management Tasks... :) Теория без практики мертва!

А я ещё вспомнил про Robocopy, и оно встроено в Windows. Тоже наверняка можно эту задачу реализовать.
Ещё раз спасибо, инцидент исперчен.

Iska 07-06-2014 02:16 2361039

Цитата:

Цитата DJ Mogarych
Теория без практики мертва! »

Хуже того: ты можешь много лет знать все составляющие, но сделать один, последний шаг — тебе вот как-то не хватает тямы. Яркая иллюстрация.


Время: 01:37.

Время: 01:37.
© OSzone.net 2001-