【问题标题】:Delete X number of files X Old days -Powershell删除 X 个文件 X 旧时代 -Powershell
【发布时间】:2016-01-20 22:34:10
【问题描述】:
Get-ChildItem –Path  “H:\backups” –Recurse | Where-Object{$_.CreationTime –lt (Get-Date).AddDays(-4)} | Remove-Item 

我有这个脚本可以删除超过 4 天的文件。但是我想控制它应该删除 X 个文件 + 4 天前的文件夹,并且还想获取日志以便我以后看到它。 下面是脚本,可以吗?

$Now = Get-Date
$Days = "4"
$TargetFolder = "H:\backups"
$LastWrite = $Now.AddDays(-$days)
$Files = get-childitem $TargetFolder -include *.*  -recurse -force
     Where {$_.CreationTime -le "$LastWrite"} 
    foreach ($i in Get-ChildItem $TargetFolder -recurse)
{
    if ($i.CreationTime -lt ($(Get-Date).AddDays(-10)))
    {
        Remove-Item $Files -recurse -force
    }
}
    Write-Output $Files >> c:\delete.log

【问题讨论】:

  • 没问题 - 你问它是否有效?您可以通过在包含测试文件的测试目录中测试脚本来自己发现这一点。
  • 没工作你有吗?如何获取在下面的脚本中删除了哪些文件的输出。 Get-ChildItem –Path “H:\backups” –Recurse | Where-Object{$_.CreationTime –lt (Get-Date).AddDays(-4)} |删除项目
  • 在删除之前输出文件名。

标签: powershell


【解决方案1】:

我相信这会起作用,允许您传递路径和您希望保留的天数作为参数:

function RemoveOld($path, $filefilter, $daystokeep)
{
    $findfiles = @(Get-ChildItem -Path $path -Include $filefilter)
    $toRemove = $findfiles | Where-Object CreationTime -le (Get-Date).AddDays(-$daystokeep)
    $toRemove >> c:\temp\delete.log
    $toRemove | Remove-Item
}

RemoveOld -path "H:\backups\*" -filefilter "*" -daystokeep 4

我还建议不要删除早于给定时间范围的文件,而是删除早于最近 X 个文件的文件。通过这种方式,您将始终保留一定数量的文件,并且不会在备份以某种方式无法运行数天时导致所有文件都被删除的情况。这可能是一个选项,具体取决于您的文件夹结构的设置方式(修改 filefilter 参数,以免删除超出预期的内容)。

function RemoveOlder($path, $filefilter, $filestokeep)
{
    $findfiles = @(Get-ChildItem -Path $path -Include $filefilter)
    if ($findfiles.Count -gt $filestokeep) {
        $findfiles | Sort-Object LastWriteTime -Descending | Select-Object -Last ($findfiles.Count - $filestokeep) | Remove-Item
    }
}

RemoveOlder -path "H:\backups\*" -filefilter "*" -filestokeep 4

【讨论】:

  • 嗨@justin 它会根据修改日期只保留 4 个文件+文件夹还是新的?
  • @jacksh 使用该代码示例将仅保留基于修改日期 (LastWriteTime) 的四个最新文件并删除较旧的文件。
【解决方案2】:

在你原来的命令上,添加这个:

 -Verbose 4>&1 | Out-File -FilePath D:\delete.log -Append

4 是 Verbose 输出,因此这会将 Verbose 重定向到 stdout 1,然后将两者都重定向到日志文件。最后的命令是:

Get-ChildItem –Path  “H:\backups” –Recurse `
 | Where-Object{$_.CreationTime –lt (Get-Date).AddDays(-4)} `
 | Remove-Item -Verbose 4>&1 | Out-File -FilePath C:\delete.log -Append

更新:如果您希望命令在没有交互的情况下运行并继续执行计划任务的错误等,请将其他参数添加到Remove-Item

Get-ChildItem –Path  “H:\backups” –Recurse `
   | Where-Object{$_.CreationTime –lt (Get-Date).AddDays(-4)} `
   | Remove-Item -Verbose -Force -ErrorAction SilentlyContinue -Confirm:$false 4>&1 `
   | Out-File -FilePath C:\delete.log -Append

【讨论】:

  • 这个脚本很好,但是当我运行它时它不断弹出并要求确认我们可以跳过我们需要从任务调度程序安排它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多