首页 > 解决方案 > 删除每个文件夹和子文件夹中的 X 个文件

问题描述

我想删除文件夹及其子文件夹中的文件,但不是X每个文件夹中的最后一个文件。例如,在C:\Test我想保留 10 个 txt 文件,但也在C:\Test\subtest1C:\Test\subtest2. 这里,XX 是我要保留的文件数。

但它不会在每个文件夹中保留 10 个文件,而是在整个树状结构中保留。

我的脚本功能不全,但在C:\Test目录中做得很好:

Set-ExecutionPolicy unrestricted $txtfiles = 'C:\Users\MUC8VX\Documents\Test
ForEach-Object {    Get-ChildItem $txtfiles | where{ -not $_.PsIsContainer}|
     sort LastWriteTime -desc| select -Skip 10 |
     Remove-Item -Include *.txt* -Force }

如果我添加-Recurse它不会在每个文件夹中保留 10 个文件,而是在整个树状结构中保留:

Set-ExecutionPolicy unrestricted
$txtfiles =`C:\Users\MUC8VX\Documents\Test'
ForEach-Object {    Get-ChildItem $txtfiles -Recurse | where{ -not
 $_.PsIsContainer}| sort LastWriteTime -desc|
     select -Skip 10 | Remove-Item -Include *.txt* -Force }

编辑:非常感谢Manuel Batsching。

这是一个通用脚本:

#Insert your parent folder which contains files and subfolders

Get-Childitem -Path C:\Your\Parent\Folder -Recurse | 

Group-Object Directory | 
ForEach-Object { 
    $_.Group |

        #sort by the last written files 
        Sort-Object LastWriteTime -Descending |

        #Keep the X last files you want to keep 
        Select-Object -Skip X |

        #Remove files according to their extension
        Remove-Item -Include *.extension* -Force }

标签: powershellscripting

解决方案


我没有测试,但你可以试试这个。

Set-ExecutionPolicy unrestricted
$txtfiles = 'C:\Users\MUC8VX\Documents\Test'
Get-ChildItem -Directory -Recurse -Path $txtfiles | ForEach-Object {
    Get-ChildItem -Path $_.fullname -Include *.txt | Sort-Object LastWriteTime -Descending | Select-Object -Skip 10 | Remove-Item -Force
}

基本上,此代码递归地遍历每个文件夹,对于每个文件夹,它会找到文件,跳过 10 并删除所有其他文件。


推荐阅读