Select objects in folder by date range

I am trying to select objects in a folder by date range

Function Get-DateRange
{
[System.Reflection.Assembly]::LoadWithPartialName(“System.windows.forms”) |
out-null

$WinForm = New-Object Windows.Forms.Form
$WinForm.text = “Calendar Control”
$WinForm.Size = New-Object Drawing.Size(411,190)

$Calendar = New-Object System.Windows.Forms.MonthCalendar
$Calendar.MaxSelectionCount = 356
$Calendar.SetCalendarDimensions([int]2,[int]1)
$WinForm.Controls.Add($Calendar)

$WinForm.Add_Shown($WinForm.Activate())
$WinForm.showdialog() | Out-Null
$Calendar.SelectionRange
} #end function Get-DateRange

*** Entry point to script ***

$dates = Get-DateRange

Get-ChildItem -path “\server.domain.com\path” | Where-Object { $.LastWriteTime -like ($dates).start -and $.LastWriteTime -like ($dates).end}

When I run this the calender comes up and when I select my date range and then close but the result of the files to not populate… I do not get any errors it just returns nothing. so I think what I am doing wrong is just in the last bit.

Can someone help me sort this out?

You problem is here with your Where-Object. -like is not the correct operator to use. You need -gt and -lt

Get-ChildItem -path "\\server.domain.com\path" | Where-Object { $_.LastWriteTime -gt ($dates).start -and $_.LastWriteTime -lt ($dates).end}

Thanks Curtis but that still doesn’t work. I am still getting no results returned and I have verified there are objects in the folder for if I manually run

Get-ChildItem -path “\server.domain.com\path”

it will return what is there and I can see the LastWriteTime property.

But when I try to add in the dates I get nothing.

Hi,

Looking at last bit where you do logical compare makes me wonder.

You take an object (where-object) and then say that this object has to have LastWriteTime same as date.start and same as date.end. This is because you use “-and”. This is possible only if you select 1 day range.

I think you should say:
Where-Object { $.LastWriteTime -ge ($dates).start -and $.LastWriteTime -le ($dates).end}

This would translate to LastWriteTime is same or higher than start date AND is lower or equal as date.end.

Didn’t test this :slight_smile:

And ups, Curtis beat me to it :slight_smile:

This is my run of your code with nothing more that the -gt -lt changes and a path that is local for me. I selected a range of Dec 1 - Dec 9. I also tested both PoSh 2.0 and 4.0. Worked in both versions.

Function Get-DateRange
{
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") |
out-null

$WinForm = New-Object Windows.Forms.Form
$WinForm.text = "Calendar Control"
$WinForm.Size = New-Object Drawing.Size(411,190)

$Calendar = New-Object System.Windows.Forms.MonthCalendar
$Calendar.MaxSelectionCount = 356
$Calendar.SetCalendarDimensions([int]2,[int]1)
$WinForm.Controls.Add($Calendar)

$WinForm.Add_Shown($WinForm.Activate())
$WinForm.showdialog() | Out-Null
$Calendar.SelectionRange
} #end function Get-DateRange

# *** Entry point to script ***
$dates = Get-DateRange

#Get-ChildItem -path "\\server.domain.com\path" | Where-Object { $_.LastWriteTime -like ($dates).start -and $_.LastWriteTime -like ($dates).end}
Get-ChildItem -path "F:\Temp\Powershell\part" | Where-Object { $_.LastWriteTime -gt ($dates).start -and $_.LastWriteTime -lt ($dates).end}

Results:

    Directory: F:\Temp\Powershell\part


Mode                LastWriteTime     Length Name                                                                                                                                                                               
----                -------------     ------ ----                                                                                                                                                                               
-a---         12/2/2015   2:19 AM        174 test.ps1                                                                                                                                                                           
-a---         12/2/2015  12:25 PM         79 FileP.txt.alsdfjlas                                                                                                                                                                
-a---         12/2/2015  12:26 PM         88 FileD.txt.g65fg4                                                                                                                                                                   
-a---         12/2/2015  12:26 PM         78 FileR.txt.af8a9etaf                                                                                                                                                                
-a---         12/2/2015  12:26 PM         78 FileR.txt - Copy.af8a9etaf                                                                                                                                                         
-a---         12/2/2015  12:25 PM         79 FileP.txt - Copy.alsdfjlas                                                                                                                                                         
-a---         12/2/2015  12:26 PM         88 FileD.txt - Copy.g65fg4 

Here is what I discovered…

If I just select a range up until today so 1-9 it returns no results.

However if I add one day into the future (december 1 - 10) then it returns the results

That means your files were last modified today. If you look at the values returned by the MonthCalendar object, you will see that it returns a datetime object at 00:00 hours (12:00 AM) for the date you select. So selecting today’s date as an ending date does not inlcude today’s files.

Function Get-DateRange
{
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") |
out-null

$WinForm = New-Object Windows.Forms.Form
$WinForm.text = "Calendar Control"
$WinForm.Size = New-Object Drawing.Size(411,190)

$Calendar = New-Object System.Windows.Forms.MonthCalendar
$Calendar.MaxSelectionCount = 356
$Calendar.SetCalendarDimensions([int]2,[int]1)
$WinForm.Controls.Add($Calendar)

$WinForm.Add_Shown($WinForm.Activate())
$WinForm.showdialog() | Out-Null
$Calendar.SelectionRange
} #end function Get-DateRange

# *** Entry point to script ***
$dates = Get-DateRange
$dates | FT -AutoSize

Results:

Start                 End                  
-----                 ---                  
12/1/2015 12:00:00 AM 12/9/2015 12:00:00 AM

One easy work around is to add 1 day to your end value. That also means you should probably use -ge and -lt, rather than -gt and -lt in your Where-Object.

Function Get-DateRange
{
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") |
out-null

$WinForm = New-Object Windows.Forms.Form
$WinForm.text = "Calendar Control"
$WinForm.Size = New-Object Drawing.Size(411,190)

$Calendar = New-Object System.Windows.Forms.MonthCalendar
$Calendar.MaxSelectionCount = 356
$Calendar.SetCalendarDimensions([int]2,[int]1)
$WinForm.Controls.Add($Calendar)

$WinForm.Add_Shown($WinForm.Activate())
$WinForm.showdialog() | Out-Null
$Calendar.SelectionRange
} #end function Get-DateRange

# *** Entry point to script ***
$dates = Get-DateRange
$dates | FT Start, End -AutoSize

$dates.Start
$dates.End
$dates.End.AddDays(1)

Results:

Start                 End                  
-----                 ---                  
12/1/2015 12:00:00 AM 12/9/2015 12:00:00 AM

Tuesday, December 01, 2015 12:00:00 AM
Wednesday, December 09, 2015 12:00:00 AM
Thursday, December 10, 2015 12:00:00 AM

Hi Curtis thanks again for your help, your suggestion ended up doing the trick for me.

Hello,

Interesting enough but I would like to use these kind of forms and specify the start time as well. Because I want to implement them in maintenance plans and usually those have specific times in them. For example:

Maintenance window: Saturday 10/09/2016 8:00AM -> 11/09/2016 12PM
How can one add the time as selection as well?

Thanks