首页 > 解决方案 > Powershell脚本以递归方式删除每个文件夹中的文件,除了最近写入时间的10个文件夹

问题描述

我想写一个脚本作为标题。我在递归地做这件事上遇到了麻烦,所以我试着在参数中传递路径。问题是,当我将 1 个参数传递给脚本时,它可以正常工作,但是当我开始传递更多参数时,它不会跳过下一个文件夹中的 10 个文件,它只会跳过第一个文件夹中的正确数量的文件。如果有人可以帮助递归地执行此操作并仅将路径传递给父目录或仅单独传递每个路径,我会很高兴。这是我的代码,它仅适用于第一个传递的参数。

Param(
    [string[]]$path
    )



Get-ChildItem $path |

    #skip directories
    Where-Object { -not $_.PsIsContainer } |
    
    #Sort by last write time
    Sort-Object -Descending -Property LastWriteTime | 
    
    #Skip 10 most recent
    Select-Object -Skip 10 |
    
    Remove-Item -whatif

标签: windowspowershellskip

解决方案


由于您将整个数组传递给 Get-ChildItem,因此它将通过管道将所有目录中的所有文件一次性排序。尝试将整个管道包裹在 foreach 中。

foreach($item in $path){
  Get-ChildItem $item | 
     Where-Object { -not $_.PsIsContainer } | 
     Sort-Object -Descending -Property LastWriteTime | 
     Select-Object -Skip 10 | Remove-Item -whatif
}

推荐阅读