【问题标题】:Powershell delete Folder if all Files older than x days如果所有文件早于 x 天,Powershell 删除文件夹
【发布时间】:2017-07-28 17:40:19
【问题描述】:

我是 PowerShell 的新手,对它了解不多。

如果其中的所有文件都超过 x 天,我正在寻找一种删除文件夹和所有子文件夹的方法。我有一个代码可以删除文件夹和所有子文件夹中的所有文件,但我不知道如何正确更改。

$Now = Get-Date

$Days = "30"

$TargetFolder = "C:\temp"
$Extension = "*.*"
$LastWrite = $Now.AddDays(-$Days)

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | Where {($_.CreationTime -le "$LastWrite") -and ($_.LastWriteTime -le "$LastWrite")}


foreach ($File in $Files) 
    {
    if ($File -ne $NULL)
        {
        write-host "Deleting File $File" -ForegroundColor "Red"
        Remove-Item $Location.FullName | out-Null
        }
    else
        {
        Write-Host "No more files to delete!" -foregroundcolor "Green"
        }
    }

【问题讨论】:

  • 30 天前创建还是修改?
  • 两者都必须得到尊重,因为如果您在 2015 年下载了一个文件,ModifieDate 是 2015 年,而您在 2017 年 22 月 2 日将其移至“C:\temp”,而不是 CreationDate想删除它。
  • 复制文件不会修改创建日期或写入时间,不知道你想如何实现
  • 好吧,不如说是 30 天前创建的 :)

标签: powershell directory


【解决方案1】:

枚举所有文件夹并首先对它们进行最长路径排序,因此您从下到上处理目录:

Get-ChildItem $TargetFolder -Recurse -Directory |
    Select-Object -Expand FullName |
    Sort-Object Length -Desc

过滤列表中没有任何文件或文件夹比 x 天更新的目录:

... | Where-Object {
    -not $(Get-ChildItem $_ -Recurse | Where-Object {
        $_.Creationtime -ge $LastWrite -or
        $_.LastWriteTime -ge $LastWrite
    })
}

然后删除生成的文件夹:

... | Remove-Item -Recurse -Force

【讨论】:

  • 看起来这段代码假设更长的路径更深? /i/am/a/deep/path.txt /i_am_a_very_shallow_path_with_a_long_name/path.txt
  • @cds84 代码假设/some/folder/with_subfolder/some/folder长,所以文件夹树可以自下而上删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多