2015-11-02 4 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 -and ** и все еще не удалял файлы вообще. Вот мои файлы для справки, если это помогает вообще: http://imgur.com/N6YgHWk –

+0

@AustinKargl Последний доступ! = Последняя модификация. Вы ищете 'LastWriteTime'. –

+0

Изменение этого значения до 'LastWriteTime', к сожалению, не изменило результат. Код, хотя и не исключая мои каталоги, работал так, как предполагалось, с помощью «LastAccessTime» –

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