2015-11-02 152 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'的设计工作。 –