我有一個目錄列表,它們的格式與版本號相同,並希望找到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
排序正確。
它看起來像你缺少一個。 :Sort-Object {$ _。Name -as [version]},而不是Sort-OBject {$ _Name -as [Version]} – 2011-12-21 01:55:52
我注意到,發佈這個之後,請原諒我的胖手指。出於興趣,爲什麼沒有拋出錯誤?它只是試圖找到一個變量$ _Name而沒有找到它,並嘗試將null傳遞給構造函數? – jonnii 2011-12-21 14:31:59
PowerShell中的屬性訪問從不拋出錯誤(它們寫入$ error),而是返回空值。這樣當你顯示一個對象的某些屬性不起作用時,你不會交錯錯誤和輸出。您可以通過打開嚴格模式來切換PowerShell如何處理此操作:Set-StrictMode -Version Latest。 – 2011-12-21 20:13:27