получить файлы/папки, не записанные в течение определенного диапазона дат

Что такое команда powershell для поиска файлов в папке, которые не соответствуют критериям диапазона дат для фильтра Get-Childitem из LastWriteTime.

Итак, проверьте, есть ли в каталоге файлы, которые НЕ содержат файлов с LastWriteTime в период с 10.01.2012 (1 октября) по 25.10.2012 (25 октября).

Я хочу отобразить папки, в которых НЕТ файлов из этого диапазона... таким образом я знаю, что они старые, и весь каталог можно удалить.

пример этого:

Folder1 — некоторые файлы, записанные в октябре — игнорируют всю эту папку и не отображают их в результатах.

Папка2 - НЕТ файла, LastWriteTime записанного в октябре месяце, поэтому эта папка и файлы должны отображаться.

Я знаю, что это можно сделать с помощью Get-ChildItem, и я застрял на бите ниже..

Get-ChildItem E:\LogArchive -Recurse | Where-Object{$_.LastWriteTime.......?

person lara400    schedule 25.10.2012    source источник


Ответы (2)


Простое решение вне головы таково:

Where-Object{ $_.LastWriteTime -lt $startDate -or $_.LastWriteTime -gt $endDate }

где $startDate равно 01/10/2012 (1st Oct), а $endDate равно 25/10/2012 (25th Oct).

Проблема с этим подходом заключается в том, что он не учитывает фактор времени в [datetime]. Итак, в вашем примере, если у вас есть 25-Oct-2012 в качестве верхней границы, он вернет файлы, созданные в 25-Oct-2012 9:00, которые вам могут не понадобиться.

Ниже код вычисляет [datetime] с усеченной частью времени на основе входных данных [datetime] и строит диапазон дат с начала месяца до даты ($dayStart, $dayEnd):

$entry_date = "20-Oct-2012 9:00" #to feed current date, use this: Get-Date
$dayEnd = Get-Date $entry_date -Minute 0 -Hour 0 -Second -0;
$dayStart = Get-Date $endDate -Day 1;
$dayStart, $dayEnd

Для этого примера кода вот вывод:

Monday, October 01, 2012 12:00:00 AM 
Saturday, October 20, 2012 12:00:00 AM

Обратите внимание, что этот подход является гибким, потому что вы можете установить $entry_date либо в Date, либо в String, и он может иметь или не иметь временную часть - он будет работать во всех этих случаях. Затем вы можете иметь этот код в Where-Object:

Where-Object{ $_.LastWriteTime -lt $dayStart -or $_.LastWriteTime -ge $dayEnd.AddDays(1) }

Обратите внимание, как -ge $dayEnd.AddDays(1) решает проблему при сравнении 25-Oct-2012 с 25-Oct-2012 9:00.

person Neolisk    schedule 25.10.2012
comment
кажется, что это работает, но я получаю следующую ошибку: Неверный аргумент для оператора '-gt': Не удалось сравнить 09.02.2012 20:00:02 с 23.10.2012. Ошибка: невозможно преобразовать значение 23/10/2012 в тип System.DateTime. Ошибка: строка не была распознана как допустимая дата и время. В строке: 1 символ: 112 + Get-ChildItem E:\LogArchive -Recurse | Where-Object {$_.LastWriteTime -lt 10.01.2012 -or $_.LastWriteTime -gt ‹‹‹‹ 23.10.2012 } + CategoryInfo: InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId: BadOperatorArgument - person lara400; 25.10.2012
comment
@lara400: Если вы укажете Date как String, убедитесь, что вы преобразовали его в [datetime] и будьте осторожны, чтобы поместить его в тот же формат, который ожидает ваша культура. Или вы можете просто использовать этот формат [datetime]"25-Oct-2012" - должно работать во всех случаях. Или используйте [datetime]::ParseExact. - person Neolisk; 25.10.2012

Попробуй это:

[datetime]$startDate = "10/01/2012" # or $startDate = get-date -Date  1/10/2012
[datetime]$endDate = "10/25/2012"   # or $endDate   = get-date -Date 25/10/2012

 ? { $_.LastWriteTime -lt $startDate -or $_.LastWriteTime -gt $endDate }
person CB.    schedule 25.10.2012
comment
Чем ваш ответ принципиально отличается от моего? - person Neolisk; 25.10.2012
comment
@Neolisk показывает приведение к объекту [datetime], необходимому для сравнения. - person CB.; 25.10.2012
comment
Этого не было в исходном вопросе, поэтому несущественная разница, ИМХО. - person Neolisk; 25.10.2012