繁体   English   中英

Windows PowerShell-删除X天之前的文件

[英]Windows PowerShell - Delete Files Older than X Days

我目前是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中运行。

当命令生效时,它将被“翻译”为一个任务,该任务将在另一个任务完成一些备份之后每晚运行。

我是在烟斗里做的

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

这对我有用。 因此,您不必照顾文件的正确路径。

其他解决方案

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

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

另一个要注意的是,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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM