You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取一年中指定工作日的第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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:10:28