我目前使用下面的Powershell脚本来删除所有文件目录和“$ dump_path”七天或更旧的基于创builddate而不是修改date的子目录。
这个脚本的问题是,如果文件夹“A”是七(或更多)天,它将被删除,即使其子文件夹和文件less于七天。
我想要这个脚本做的是从根目录和“$ dump_path”的所有子文件夹中删除七天或七天以上的所有文件,但保留less于七天的文件和文件夹的父文件夹即使这意味着父文件夹超过七天。 如果所有子文件夹和文件都比父文件夹晚7天或更早,则可以删除父文件夹。
我知道这个问题有点模糊,但是我们的目的是在共享区域的“沙箱”位置保留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 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)
我注意到,生成的电子邮件只包含被删除的文件的列表,而不是文件夹,所以还没有计算出为什么文件夹没有列出(如果你有任何想法将是伟大的)。