Today I was writing a script to rotate some log files on a machine, as for regulatory reasons I need to keep logs for a number of years I thought to archive files on a monthly basis so to make archival easier.
My main goal is not locking myself into a script that would simply remove/archive all files from a certain date onward, for example get first day of previous month and archive anything newer than that, but rather something that would let PowerShell calculate first and last day in a month and then archive any log file created in that timeframe.
Calculate the first day of a given month it’s easy as PowerShell does this natively for example
$firstDayOfMonth = (Get-Date -Year 2016 -Month 5 -Day 1) Sunday, May 01, 2016 6:18:00 AM
Of course you can tweak the above command to format output a bit for example
Get-Date -Year 2016 -Month 5 -Hour 00 -Minute 00 -Second 00 Friday, May 20, 2016 12:00:00 AM
Calculating the last day is not that straightforward but thankfully native .NET can help here
$previousMonth= (Get-Date).AddMonths(-1) $lastDayOfMonth = [System.DateTime]::DaysInMonth($previousMonth.Year, $previousMonth.Month) [datetime]"$($previousMonth.Month), $lastDayOfMonth, $($previousMonth.Year), 23:59:59.999" # Output sabato, 30 aprile 2016 23:59:59
The above will print directly to screen result of the last month’s day but you can easily change it so to save result to a variable for example
$tmpLastDayOfMonth = [System.DateTime]::DaysInMonth($archiveMonth.Year, $archiveMonth.Month) # Format returned value of the .NET [System.DateTime]::DaysInMonth to a proper datetime $lastDayOfMonth = [datetime]"$($archiveMonth.Month), $tmpLastDayOfMonth, $($archiveMonth.Year), 23:59:59.999"
If you are simply trying to find last day of the current month this is easier and can be accomplished like this
Get-Date -day 1 -hour 0 -minute 0 -second 0).AddMonths(1).addseconds(-1) #Output Tuesday, May 31, 2016 11:59:59 PM
I’m sure there are other, perhaps better, ways to achieve the same result and I’d be curious to read your comments below with your suggestion and experiences.
[su_note note_color=”#ffff96″ text_color=”#000000″ radius=”5″]Note: Please note the above output is taken from a server with en-US regional settings, the output you will get depends on the machine regional settings. In any case when using the above in a script you don’t have to worry about the date conversion, for example when searching for files older than a certain date, as PowerShell will perform the conversion internally. [/su_note]