在PowerShell中删除最旧版本的目录

时间:2011-12-19 21:50:08

标签: powershell

我有一个目录列表,其格式类似于版本号,并希望找到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正确排序。

2 个答案:

答案 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