获取未在特定日期范围内写入的文件/文件夹

时间:2012-10-25 13:56:24

标签: powershell powershell-v2.0

powershell命令用于查找文件夹中不符合Get-Childitem LastWriteTime过滤器日期范围标准的文件。

因此,请检查目录是否包含在2012年10月1日(10月1日)至10月25日(10月25日)之间不包含LastWriteTime的任何文件的文件。

我想显示那些没有该范围内任何文件的文件夹...这样我知道它们已经老了,整个目录都可以删​​除。

这样的例子是:

Folder1 - 10月份写的一些文件 - 忽略整个文件夹,不在结果中显示这些文件

Folder2 - 没有文件在10月份写入LastWriteTime,因此应显示此文件夹和文件。

我知道这可以通过Get-ChildItem完成,而且我被困在下面......

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

2 个答案:

答案 0 :(得分:3)

头顶上的简单解决方案就是:

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

其中$startDate01/10/2012 (1st Oct)$endDate25/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设置为DateString,它可能有也可能没有时间 - 它可以在所有这些情况下使用。然后,您可以在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如何解决问题。

答案 1 :(得分:2)

试试这个:

[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 }