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

Каква е командата на powershell за намиране на файлове в папка, които не отговарят на критерии за диапазон от дати за Get-Childitem филтъра на LastWriteTime.

Така че, проверете дали дадена директория има файлове, които НЕ съдържат файлове, които имат LastWriteTime между 01/10/2012 (1 октомври) до 25/10/2012 (25 октомври).

Искам да покажа папките, които НЯМАТ файлове, които са в този диапазон...по този начин знам, че са стари и цялата директория може да бъде изтрита.

пример за това е:

Папка1 - някои файлове, записани през октомври - игнорирайте цялата тази папка и не ги показвайте в резултатите

Папка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': Не може да се сравни 02/09/2012 20:00:02 с 23/10/2012. Грешка: Не може да се преобразува стойност 23/10/2012 в тип System.DateTime. Грешка: Низът не беше разпознат като валиден DateTime.. At line:1 char:112 + Get-ChildItem E:\LogArchive -Recurse | Where-Object{ $_.LastWriteTime -lt 01/10/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
Не беше в първоначалния въпрос, така че не е съществена разлика, IMHO. - person Neolisk; 25.10.2012