如何获取一年中指定工作日的第5个日期?求PowerShell实现方案
用PowerShell查找并创建Outlook中某月的第5个周五约会
核心判定逻辑
一个月份存在第5个周五的条件是:该月最后一个周五的日期≥29日(前4周最多覆盖到当月28日,29日及之后的周五必然是第5个实例)。
步骤1:编写PowerShell脚本筛选符合条件的日期
以下脚本可遍历指定年份的所有月份,快速定位存在第5个周五的日期:
# 指定目标年份 $targetYear = 2024 # 遍历1-12月 for ($month = 1; $month -le 12; $month++) { # 获取当月最后一天 $lastDayOfMonth = [DateTime]::DaysInMonth($targetYear, $month) $endDate = Get-Date -Year $targetYear -Month $month -Day $lastDayOfMonth # 计算当月最后一个周五的日期 $daysToSubtract = ([int]$endDate.DayOfWeek - [int][DayOfWeek]::Friday + 7) % 7 $lastFriday = $endDate.AddDays(-$daysToSubtract) # 判断是否为第5个周五 if ($lastFriday.Day -ge 29) { Write-Host "找到第5个周五:$($lastFriday.ToString('yyyy-MM-dd'))" # 此处可直接调用创建Outlook事件的函数 } }
步骤2:添加Outlook约会/会议创建功能
下面的函数可直接创建Outlook日历约会,若需发送会议邀请,只需修改保存逻辑为参会者邀请模式:
function New-OutlookFiveFridayEvent { param( [Parameter(Mandatory=$true)] [DateTime]$EventDate, [string]$Subject = "第5个周五固定会议", [string]$Body = "每月第5个周五的团队同步会议", [string]$Location = "线上会议室", [TimeSpan]$StartTime = [TimeSpan]::Parse("14:00"), [TimeSpan]$Duration = [TimeSpan]::Parse("01:00") ) # 初始化Outlook COM对象 $outlook = New-Object -ComObject Outlook.Application $eventItem = $outlook.CreateItem(1) # 1代表约会类型 # 设置会议/约会核心属性 $eventItem.Subject = $Subject $eventItem.Body = $Body $eventItem.Location = $Location $eventItem.Start = $EventDate.Date.Add($StartTime) $eventItem.Duration = $Duration.TotalMinutes $eventItem.ReminderSet = $true $eventItem.ReminderMinutesBeforeStart = 15 # 【可选】创建会议邀请模式:添加参会者后替换Save()为Send() # $eventItem.Recipients.Add("参会者邮箱@example.com") # $eventItem.Send() # 保存约会到本地日历 $eventItem.Save() Write-Host "已创建日历事件:$($EventDate.ToString('yyyy-MM-dd')) $StartTime" # 释放COM对象,避免资源占用 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($eventItem) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($outlook) | Out-Null }
整合使用示例
将日期筛选和事件创建逻辑结合,一次性生成指定年份所有第5个周五的Outlook约会:
$targetYear = 2024 for ($month = 1; $month -le 12; $month++) { $lastDay = [DateTime]::DaysInMonth($targetYear, $month) $endDate = Get-Date -Year $targetYear -Month $month -Day $lastDay $daysToSubtract = ([int]$endDate.DayOfWeek - [int][DayOfWeek]::Friday + 7) % 7 $lastFriday = $endDate.AddDays(-$daysToSubtract) if ($lastFriday.Day -ge 29) { New-OutlookFiveFridayEvent -EventDate $lastFriday -Subject "月度团队同步会" } }
注意事项
- 首次运行脚本时,Outlook会弹出权限提示,需允许PowerShell访问日历。
- 若仅需查询单个月份,直接修改循环中的
$month值为目标月份(如$month = 10代表10月)即可。 - 会议邀请模式下,确保参会者邮箱格式正确,且Outlook处于联网状态。
内容的提问来源于stack exchange,提问作者Doug
相关产品推荐
相关产品推荐

