如果创建日期大于 7 天,则 Powershell 脚本将删除子文件夹和文件,但保留子文件夹和文件的父文件夹 <7 天

3 scripting powershell

我目前正在使用下面的 Powershell 脚本删除基于创建日期和未修改日期超过 7 天的“$dump_path”的所有文件目录和子目录。

此脚本的问题在于,如果文件夹“A”存在 7(或更多)天,即使其子文件夹和文件的存在时间少于 7 天,它也会被删除。

我希望这个脚本做的是从根目录和“$dump_path”的所有子文件夹中删除所有 7 天或更长时间的文件,但保留少于 7 天的文件和文件夹的父文件夹旧,即使这意味着父文件夹已经超过 7 天。如果所有子文件夹和文件都比父文件夹早 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
Run Code Online (Sandbox Code Playgroud)

Ans*_*ers 6

我可以建议一种稍微不同的方法吗?我会先删除超过 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
Run Code Online (Sandbox Code Playgroud)