遍历每个文件夹并删除其中一些文件夹

时间:2017-05-17 02:34:46

标签: powershell

我正在尝试使用数组在多个路径中运行下面的脚本。我的目标是删除保留最后7个版本的文件夹,但它没有按预期工作。该操作仅考虑第一条路径D:\Test1

我相信我应该在($folders in $folders)之后添加ForEach-Object之类的东西,但我不知道如何。

知道我在这里错过了什么吗?

$path = @("D:\Test1","D:\Test2","D:\Test3")
$folders = Get-ChildItem -Path $path -Recurse | 
           Where-Object { $_.PSIsContainer } |
           Group-Object { $_.Name.Split('_')[0] } |
           ForEach-Object $Folders {
             $_.Group |
             sort CreationTime -Descending |
             Select -Skip 7 |
             foreach { Remove-Item $_.FullName -Force -WhatIf }
           }

2 个答案:

答案 0 :(得分:1)

这应该可以帮到你。

$path= @("D:\Test1","D:\Test2","D:\Test3")
$folders= Get-ChildItem -path $path -Recurse | Where-Object {$_.PsIsContainer} |Group-Object {$_.FullName.Split('_')[0] }
ForEach($folder in $folders)
{
$folder.Group | sort CreationTime -Descending | Select -Skip 7|% { Remove-Item $_.fullname -Force -whatIf}
}

我在当地测试过,它工作正常。虽然我没有在你的代码中出现任何错误,除了很少的格式问题,我已经把它变成了变量并将其排序,因为我纠结了太多的管道对象。

如果您在管道之后使用 foreach ,则意味着它将逐个获取管道对象。但是如果你单独使用它,那么你必须将每个迭代分配给一个变量。

希望它对你有所帮助。

答案 1 :(得分:0)

我从@Robert Israelsson那里得到了答案!

"如果您将组对象更改为不按名称分组,而是将名称更改为全名,您将获得所需的结果。"

来自:

$folders= Get-ChildItem -path $path -Recurse | Where-Object {$_.PsIsContainer} |Group-Object {$_.Name.Split('_')[0] }

要:

$folders= Get-ChildItem -path $path -Recurse | Where-Object {$_.PsIsContainer} |Group-Object {$_.FullName.Split('_')[0] }

这完美无缺!