首页 > 解决方案 > 保留最近的 n 个文件并删除其余文件

问题描述

$path = "D:\AccountServiceQAT"
$Temp = "D:\\temp1"
$limit = (Get-Date).Adddays(-5)

$Folder = Get-ChildItem  $path  | Where {$_.PSIsContainer} | Sort CreationTime -Descending | Select -First 5

$Folder | Copy-Item -Recurse -Destination $Temp

Remove-Item   $path\* -Recurse
Move-Item $Temp\* -Destination $path
Remove-Item $Temp\* -Recurse

如何在不使用 Temp 变量的情况下修改上述脚本以维护最新的 5 个时间戳文件夹并删除剩余的所有文件夹?

标签: powershell

解决方案


这对你有用。为了便于阅读,第二个命令是多行的,但它也可以在单行上运行:

$path = "D:\AccountServiceQAT"

Get-ChildItem -Directory $path | Sort-Object CreationTime |
  Select-Object -SkipLast 5 | Remove-Item -Recurse -WhatIf

警告:我不会在真实数据上进行测试。使用虚拟测试文件夹来测试上述内容。

让我们分解一下:

  • Get-ChildItem -Directory只列出目录。从技术上讲是容器,但除非您与其他提供商合作,否则您无需担心这一点。在文件系统上,“容器”指的是文件夹。
  • Sort-Object CreationTimeCreationTime按从 传递下来的属性对返回的列表进行排序Get-ChildItem
    • 默认情况下Sort-Object按升序排序。您可以使用参数更改它-Descending
  • Select-Object -SkipLast 5跳过管道中返回的最后 5 个对象。换句话说,它把它们扔掉了。这应该是您最近的 5 个文件夹。
    • 如果您要使用Sort-Object -Descending,则需要-Skip 5改为跳过5 个对象。
  • Remove-Item接受要删除的项目的管道输入。这与从 返回的对象兼容Get-ChildItem
    • -Recurse告诉Remove-Item递归删除非空文件夹。如果没有这个,它将要求您确认删除任何具有子对象(文件或文件夹)的文件夹。您不希望在自动化中这样做。

    • -WhatIf用于在Remove-Item不实际删除文件的情况下进行测试。它将显示如下输出:

      What if: Performing the operation "Remove Directory" on target "C:\Users\username\Desktop".
      What if: Performing the operation "Remove Directory" on target "C:\Users\username\Downloads".
      What if: Performing the operation "Remove Directory" on target "C:\Users\username\Favorites".
      What if: Performing the operation "Remove Directory" on target "C:\Users\username\Links".
      
    • 当您对要删除的文件集感到满意时,请替换-WhatIf-Force. -Force不会提示删除只读项,Remove-Item默认会提示你。


推荐阅读