2011-12-19 4 views
3

У меня есть список каталогов, которые отформатированы как номера версий и хотели бы найти N старых каталогов и удалить их. Например:Удалить самые старые версии каталога в PowerShell

/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

Похоже, что вам не хватает. : Sort-Object {$ _. Name -as [version]}, а не Sort-OBject {$ _Name -as [Version]} –

+0

Я заметил, что только после публикации этого, извините мои толстые пальцы. Из интереса, почему это не вызвало ошибку? Это просто попытка найти переменную $ _Name и не найти ее и попытаться передать null в конструктор? – jonnii

+1

Доступ к свойствам в PowerShell никогда не выдает ошибок (они записывают в $ error), но вместо этого просто возвращают значения null. Это значит, что когда вы показываете объект, где некоторые свойства не работают, вы не чередуете ошибку и вывод. Вы можете переключить способ использования PowerShell, включив строгий режим: Set-StrictMode -Version Latest. –

ответ

1

Натуральный вид - это то, что вы хотите. 1,2,3..10,11..instead из 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 
+0

У меня возникло искушение попытаться помещать промежуточные результаты в объект, возможно, «Tuple» или словарь ... Я дам вам попытку и дам вам знать, как я себя чувствую. – jonnii

7

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

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

Будет делать трюк.

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

+0

+1 для использования оператора '-as'. Элегантный :-) –

+1

Это элегантный, а не оператор '-as', а выражение. не понимал, что вы можете это сделать. – manojlds

+2

То же самое относится к Select-Object & Group-Object. Вы изучаете вещь или тысячу, когда работаете над командой продукта на протяжении всего цикла корабля, а затем находите компанию, которая специализируется на языке :-) Это определенно один из моих любимых уловок и трещин основных командлетов PowerShell. Это старое видео охватывает некоторые из моих любимых объектов -Object: http://channel9.msdn.com/Blogs/philpenn/PowerShell--Object-Family-of-CmdLets-and-the-Object-Pipeline –

Смежные вопросы