我有一个目录列表,其格式类似于版本号,并希望找到N个最旧的目录并删除它们。例如:
/1.2.3.4
/1.2.3.5
/1.2.3.6
我尝试了一些事情,但我似乎无法到达我需要去的地方。
我的第一次尝试就是:
ls directory | sort Name | select -first 5 | rm -r
但是我不确定这会在所有情况下起作用,因为这会(我猜)会自然地进行。这总是会返回正确的结果吗?
我的下一个想法是我可以使用System.Version
进行排序。所以我最终得到了这个:
ls directory | %{[System.Version]$_.Name } | sort | select -first 5 | ???
问题是我不确定如何将目录结果与排序联系起来......最好的方法是什么?
gci \\directory
生成
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 12/19/2011 5:19 PM 1.0.1052.54849
d---- 12/19/2011 5:29 PM 1.0.1053.54850
d---- 12/19/2011 5:36 PM 1.0.1054.54851
d---- 12/20/2011 2:11 PM 1.0.1056.54875
d---- 12/12/2011 10:39 AM 1.0.991.54625
d---- 12/12/2011 12:08 PM 1.0.992.54627
d---- 12/12/2011 12:22 PM 1.0.993.54628
d---- 12/12/2011 1:15 PM 1.0.994.54630
d---- 12/12/2011 2:45 PM 1.0.996.54636
d---- 12/12/2011 3:34 PM 1.0.997.54640
d---- 12/12/2011 3:48 PM 1.0.998.54641
gci \\directory | Sort-Object { $_Name -as [Version] }
生成
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 12/12/2011 1:15 PM 1.0.994.54630
d---- 12/12/2011 12:22 PM 1.0.993.54628
d---- 12/12/2011 2:45 PM 1.0.996.54636
d---- 12/12/2011 3:48 PM 1.0.998.54641
d---- 12/12/2011 3:34 PM 1.0.997.54640
d---- 12/12/2011 12:08 PM 1.0.992.54627
d---- 12/19/2011 5:29 PM 1.0.1053.54850
d---- 12/19/2011 5:19 PM 1.0.1052.54849
d---- 12/19/2011 5:36 PM 1.0.1054.54851
d---- 12/12/2011 10:39 AM 1.0.991.54625
d---- 12/20/2011 2:11 PM 1.0.1056.54875
这是一个网络共享是否重要?我很困惑为什么这不起作用...我做了一个快速的健全性检查,并且对我在单元测试中创建的版本进行Array.Sort
正确排序。
答案 0 :(得分:7)
您实际上可以对表达式进行排序,这将保留原始对象。
Get-ChildItem $path |
Sort-Object { $_.Name -as [Version] } |
Select-Object -Last 1 |
Remove-Item
会做的伎俩。
希望这有帮助,
答案 1 :(得分:1)
自然排序是您想要的顺序。 1,2,3..10,11 ..而不是1,10,11,2,3 ..
1..11 | %{$_.tostring()} | sort
以“ASCIIbetical”顺序给出,这不是我们期望它的自然顺序。
根据你在版本上所做的事情,我会说你可以这样做,虽然它可能有点过分:
gci directory | %{new-object psobject -p @{version=[version]($_.name);dir=$_ }} |
sort version | select -expand dir -first 5 | rm -r -whatif
或
gci directory | select @{e={[version] $_.name};l="version"}, @{e={$_};l="dir"} |
sort version | select -expand dir -first 5 | rm -r -whatif