我需要一个清理脚本来删除超过30天的所有文件,但如果文件超过30天,它应该保存最后一个。可能? :)
我已经尝试了几个参数,但无法让它真正起作用..猜我需要一个if / else子句吗? 非常感谢任何指导和帮助,谢谢
$Daysback = "-30"
$CurrentDate = Get-Date
$DatetoDelete = $CurrentDate.AddDays($Daysback)
$path = "C:\Data\*"
$save1 = Get-ChildItem -Path $path | Where-Object {($_.Name -like "Test*.zip")} | sort LastWriteTime -Descending | select -First
Get-ChildItem $path -Recurse
{($_.CreationTime -le $(Get-Date).AddDays($Daysback))}
{
Remove-Item -Recurse -Force
}
elseif ($save1)
{
Remove-Item -Recurse -Force
}
}
答案 0 :(得分:1)
这样的事情应该有效。
$Daysback = "-30"
$CurrentDate = Get-Date
$DatetoDelete = $CurrentDate.AddDays($Daysback)
$path = "C:\Data\*"
$Items=Get-ChildItem -Path $path -Recurse | Where-Object {($_.Name -like "Test*.zip") -and ($_.LastWriteTime -le ($DatetoDelete))}| Sort-Object LastWriteTime -Descending
$Items|Select-Object -Skip 1 |Remove-Item -Recurse -Force -Path $_.fullname
Get-ChildItem - >过滤,只获取名称以Test开头的项目,并以30天前编写的.Zip结尾。对它们进行排序。
在删除行中,我们使用-Skip 1跳过排序列表中的第一项,并使用其路径删除项目。
答案 1 :(得分:0)
这可以简化。下面的块将抓取C:\Data
中符合过滤条件的所有文件(显着快于Where-Object
),然后根据CreationTime
进一步减少这些文件,跳过1,然后删除其余文件。< / p>
Get-ChildItem -Path 'C:\Data' -Filter 'Test*.zip' -Recurse |
Where-Object { -not $_.PSIsContainer -and
$_.CreationTime -le (Get-Date).AddDays(-30) } |
Sort-Object -Property 'LastWriteTime' -Descending |
Select-Object -Skip 1 |
Remove-Item -Force -WhatIf