В настоящее время я использую приведенный ниже сценарий Powershell, чтобы удалить все каталоги файлов и подкаталоги «$ dump_path», возраст которых составляет семь дней или более в зависимости от даты создания, а не даты изменения.
Проблема с этим сценарием заключается в том, что если папка «A» старше семи (или более) дней, она будет удалена, даже если ее подпапки и файлы не старше семи дней.
Я бы хотел, чтобы этот скрипт удалил все файлы из корня и во всех подпапках «$ dump_path», возраст которых семь или более дней, но сохранял родительские папки с файлами и папками, срок хранения которых составляет менее семи дней. старые, даже если это означает, что возраст родительских папок превышает семь дней. Если все подпапки и файлы на семь дней или старше родительской папки, то родительскую папку можно удалить.
Я знаю немного неясную проблему, но намерение состоит в том, чтобы сохранить 7-дневный период хранения всех данных в «песочнице» наших общих областей.
Кроме того, дополнительный бонус, если он может создать журнал того, что он удаляет, и отправить его по электронной почте об удалении сообщений.
# set folder path
$dump_path = "c:\temp"
# set minimum age of files and folders
$max_days = "-7"
# get the current date
$curr_date = Get-Date
# determine how far back we go based on current date
$del_date = $curr_date.AddDays($max_days)
# delete the files and folders
Get-ChildItem $dump_path | Where-Object { $_.CreationTime -lt $del_date } | Remove-Item -Recurse
Могу я предложить немного другой подход? Я бы сначала удалил все файлы старше 7 дней, а на втором шаге удалил пустой папки. Что-то вроде этого:
$deleted = @()
Get-ChildItem $dump_path -Recurse | Where-Object {
-not $_.PSIsContainer -and $_.CreationTime -lt $del_date
} | ForEach-Object {
$deleted += $_.FullName
$_
} | Remove-Item
function Remove-EmptyFolders($folder) {
Get-ChildItem $folder | Where-Object { $_.PSIsContainer } | ForEach-Object {
$path = $_.FullName
Remove-Emptyfolders $path
if ( @(Get-ChildItem $path -Recurse | Where-Object { -not $_.PSIsContainer}).Length -eq 0 ) {
$deleted += $path
Remove-Item $path -Recurse -Force
}
}
}
Remove-EmptyFolders $dump_path
$html = $deleted | Select-Object @{Name='Path';Expression={$_}} | ConvertTo-Html
Большое спасибо за код. Это было большим подспорьем.
Я добавил следующее, чтобы отправить электронное письмо с результатами удаления:
$style = "<style>BODY{font-family: Arial; font-size: 10pt;}"
$style = $style + "TABLE{border: 1px solid black; border-collapse: collapse;}"
$style = $style + "TH{border: 1px solid black; background: #dddddd; padding: 5px; }"
$style = $style + "TD{border: 1px solid black; padding: 5px; }"
$style = $style + "</style>"
$html = $deleted | Select-Object @{Name='Path';Expression={$_}} | ConvertTo-Html -Head $style
#SMTP server name
$smtpServer = "smtp.xxxx.com"
#Creating a Mail object
$msg = new-object Net.Mail.MailMessage
#Creating SMTP server object
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
#Email structure
$msg.From = "email@xxxx.com"
#$msg.ReplyTo = "replyto@xxxx.com"
$msg.To.Add("email@xxxx.com")
$msg.subject = "Deleted files and folders"
$msg.IsBodyHTML = $true
$msg.body = $html
#Sending email
$smtp.Send($msg)
Я заметил, что созданное электронное письмо содержало только список удаленных файлов, а не папки, поэтому не понял, почему папки не указаны (если у вас есть какие-то идеи, которые были бы отличными).