我正在尝试使用数组在多个路径中运行下面的脚本。我的目标是删除保留最后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 }
}
答案 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] }
这完美无缺!