Windows PowerShell - 删除超过X天的文件

时间:2016-10-28 06:45:52

标签: powershell powershell-v3.0

我目前是PowerShell的新手,我根据网上收集的信息创建了一个脚本,该脚本将对其LastWriteTime少于1天的文件夹中的已找到文件执行删除操作。

目前脚本如下:

$timeLimit = (Get-Date).AddDays(-1) 
$oldBackups = Get-ChildItem -Path $dest -Recurse -Force -Filter "backup_cap_*" |
                Where-Object {$_.PSIsContainer -and $_.LastWriteTime -lt $timeLimit}

foreach($backup in $oldBackups)
{
    Remove-Item $dest\$backup -Recurse -Force -WhatIf
}

据我所知,-WhatIf命令会向控制台输出命令"应该"在现实场景中做。问题是-WhatIf没有输出任何内容,即使我删除它,文件也不会按预期被删除。

服务器是Windows 2012 R2,该命令正在PowerShell ISE V3中运行。

当命令工作时,它将被"翻译"在另一个任务完成备份后,每晚都会运行一个任务。

3 个答案:

答案 0 :(得分:2)

我在管道中做到了

Get-ChildItem C:\temp | ? { $_.PSIsContainer -and $_.LastWriteTime -lt $timeLimit } | Remove-Item -WhatIf

这对我有用。因此,您无需关注文件的正确路径。

答案 1 :(得分:1)

其他解决方案

$timeLimit = (Get-Date).AddDays(-1) 
Get-ChildItem C:\temp2 -Directory | where LastWriteTime -lt $timeLimit  | Remove-Item -Force -Recurse

答案 2 :(得分:0)

原始问题是$dest\$backup会假设每个文件都在根文件夹中。但是,通过在fullname上使用$backup属性,您无需静态定义目录。

另一个注意事项是Remove-Item接受字符串数组,因此您也可以删除foreach

以下是对脚本的修复,不使用管道。请注意,由于我使用where方法,因此至少需要版本4

$timeLimit = (Get-Date).AddDays(-1) 
$Backups = Get-ChildItem -Path $dest -Directory -Recurse -Force -Filter "backup_cap_*"
$oldBackups = $backups.where{$_.LastWriteTime -lt $timeLimit}
Remove-Item $oldBackups.fullname -Recurse -Force -WhatIf