Удалить самые старые версии каталога в PowerShell - PullRequest
3 голосов
/ 20 декабря 2011

У меня есть список каталогов, отформатированных как номера версий, и я хотел бы найти 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 ]

7 голосов
/ 20 декабря 2011

Вы можете на самом деле сортировать выражения, которые сохранят ваши исходные объекты.

Get-ChildItem $path  |
    Sort-Object { $_.Name -as [Version] } |
    Select-Object -Last 1 |
    Remove-Item

сделает свое дело.

Надеюсь, это поможет,

1 голос
/ 20 декабря 2011

Естественная сортировка - это порядок, который вы хотите.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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...