Назад | Перейти на главную страницу

Сценарий Powershell для удаления вложенных папок и файлов, если дата создания> 7 дней, но поддерживает родительские папки вложенных папок и файлов <7 дней назад

В настоящее время я использую приведенный ниже сценарий 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)

Я заметил, что созданное электронное письмо содержало только список удаленных файлов, а не папки, поэтому не понял, почему папки не указаны (если у вас есть какие-то идеи, которые были бы отличными).