我目前正在使用下面的 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
答案1
我可以建议一个稍微不同的方法吗?我会先删除所有超过 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
答案2
非常感谢你提供的代码。它帮了我大忙。
我添加了以下内容以发送包含删除结果的电子邮件:
$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)
我确实注意到生成的电子邮件仅包含已删除的文件列表,而不是文件夹,因此还没有弄清楚为什么没有列出文件夹(如果您有任何想法那就太好了)。