Script Powershell para excluir subpastas e arquivos se a data de criação for 7 dias, mas manter pastas pai de subpastas e arquivos de 7 dias

3

Atualmente, estou usando o script Powershell abaixo para excluir todos os diretórios e sub-diretórios de arquivos de "$ dump_path" com sete dias ou mais, com base na data de criação e não na data de modificação.

O problema com este script é que, se a pasta "A" tiver sete (ou mais) dias, ela será excluída, mesmo que suas subpastas e arquivos tenham menos de sete dias.

O que eu gostaria que esse script fizesse é excluir todos os arquivos da raiz e de todas as subpastas de "$ dump_path" com sete ou mais dias, mas manter a (s) pasta (s) pai (s) de arquivos e pastas menos de sete dias, mesmo que isso signifique que as pastas pai tenham mais de sete dias. Se todas as subpastas e arquivos tiverem sete dias ou mais do que a pasta pai, o pai poderá ser excluído.

Problema ligeiramente obscuro que eu conheço, mas a intenção é ter um período de retenção de 7 dias de todos os dados em um local de 'sandbox' de nossas áreas compartilhadas.

Além disso, um bônus adicional pode gerar um registro do que é excluído e enviado por e-mail após a exclusão.

# 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
    
por Starfish 08.09.2012 / 00:25

2 respostas

6

Posso sugerir uma abordagem ligeiramente diferente? Eu excluiria todos os arquivos com mais de 7 dias antes e, em uma segunda etapa, excluiria as pastas empty . Algo parecido com isto:

$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
    
por 09.09.2012 / 04:00
0

Muito obrigado pelo código. Foi uma grande ajuda.

Adicionei o seguinte para enviar um e-mail com os resultados da exclusão:

$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 protected]"
 #$msg.ReplyTo = "[email protected]"
 $msg.To.Add("[email protected]")
 $msg.subject = "Deleted files and folders"
 $msg.IsBodyHTML = $true
 $msg.body = $html

 #Sending email 
 $smtp.Send($msg)

Eu notei que o e-mail gerado continha apenas uma lista dos arquivos que foram excluídos, não das pastas, por isso não descobri por que as pastas não estão listadas (se você tem alguma idéia que seria ótima).

    
por 24.09.2014 / 15:39