如果创建日期超过 7 天,则 Powershell 脚本会删除子文件夹和文件,但保留子文件夹和文件的父文件夹

如果创建日期超过 7 天,则 Powershell 脚本会删除子文件夹和文件,但保留子文件夹和文件的父文件夹

我目前正在使用下面的 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)

我确实注意到生成的电子邮件仅包含已删除的文件列表,而不是文件夹,因此还没有弄清楚为什么没有列出文件夹(如果您有任何想法那就太好了)。

相关内容