As most people know, Microsoft releases patches on the second Tuesday of the month. In some organizations these patches are deployed to development, test and QA systems within a couple of days of the release. However, production systems can’t be patched until the next maintenance window. Assuming this patch window is on a Saturday, we need to find the first Saturday after the second Tuesday. When looking at a calendar this is pretty simple for most people to figure out. However, when you need a whole years worth it takes a few minutes to calculate. What we need is some code to look these up for us…like this function:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Function Get-WsusSaturday { param([datetime]$date=(Get-Date) ) $numberOfTuesdays=0 1..([datetime]::DaysInMonth( $date.year , $date.month )) | %{ $thisDate = Get-Date "$($date.month)/$($_)/$($date.year)" if ([string]$thisDate.DayOfWeek -eq 'Tuesday') { $numberOfTuesdays++ if ($numberOfTuesdays -eq 2) { $thisDate.AddDays(4).ToLongDateString() } } } } |
Line 2: accept the date as a parameter and cast it to a date/time value, defaulting to today’s date if nothing is provided
Line 3: max sure we don’t think its Tuesday already
Line 5: starting on the first of each month, loop through the max number of days in the month
Line 8: if the date is Tuesday, add one to the counter
Line 9: once we find the second Tuesday
Line 10: add 4 more days to find the following Saturday and return the date text
You can take this function and do something creative, like find the next 5 years worth of patch Saturdays.
1 2 3 4 |
