2015-11-02 150 views
0

我創建了一個腳本,它允許我搜索並忽略Remove-Item語句中的目錄,並且腳本工作,但不一定達到我需要的程度它來。

Get-ChildItem -Path $Path | 
    Where-Object { 
    ($_.LastAccessTime -lt $Limit) -and 
    -not ($_.PSIsContainer -eq $True -and $_.Name -contains ("2013","2014","2015")) 
    } | Remove-Item -Force -Recurse -WhatIf 

目前,此腳本查找和刪除

  1. 沒有被給定的時間內訪問過的所有對象

但我需要這個腳本做的是找到並刪除所有對象

  1. 在給定時間段內未訪問並且
  2. 排除包含名稱「2013」​​,「2014」或「2015」的目錄。

我並不認爲腳本「工作不正常」,但我的問題的觀點是這樣的:

怎樣編程這個腳本在目錄名稱查找第一和那麼上次訪問日期?我不知道在哪裏以及如何告訴這個腳本$_.Name需要優先於$_.LastAccessTime -lt $Limit

+0

我想一種方法是隻有兩個不同的地方管道。像這樣:'Where-Object {!($ _。PSIsContainer -eq $ True - and $ _。Name -contains(「2013」​​,「2014」,「2015」))} | Where-Object {($ _。LastAccessTime -lt $ Limit)}' – AutomatedOrder

+0

謝謝。我嘗試了這一點,它似乎做了完全相同的事情,但這可能是因爲@Ansgar提到的。 –

回答

1

目前你的病情的邏輯是這樣的:

是最後一次刪除對象$Limit之前訪問,是不是文件夾名稱中包含數組[「2013」​​,「2014」,「2015」。

第二個條件永遠不會是真的,因爲一個字符串永遠不能包含一個字符串數組。

此外,最後修改時間存儲在LastWriteTime屬性中。

你真正需要的是這樣的:

Where-Object { 
    $_.LastWriteTime -lt $Limit -and 
    -not ($_.PSIsContainer -and $_.Name -match '2013|2014|2015') 
} 

如果目錄名稱由僅一年,沒有別的,你也可以使用這個的:

Where-Object { 
    $_.LastWriteTime -lt $Limit -and 
    -not ($_.PSIsContainer -and '2013','2014','2015' -contains $_.Name) 
} 

注顛倒順序最後一項(array -contains value)。

+0

我試過了,它似乎不再刪除任何東西。我設定的限制是90天,那裏有超過180天的文件。我注意到 ** $ _。LastAccessTime -lt $ Limit-和** 並且它似乎仍然沒有刪除任何文件。 這裏是我的文件,如果它可以幫助所有: http://imgur.com/N6YgHWk –

+0

@AustinKargl上次訪問!=最後修改。你正在尋找'LastWriteTime'。 –

+0

不幸的是,將此值更改爲'LastWriteTime'並未改變結果。該代碼雖然不排除我的目錄,但是按照'LastAccessTime'的設計工作。 –