Outlook批量导出当前用户和所有日历信息

AI摘要
Deepseek提供支持

概述

这段 PowerShell 脚本用于从 Outlook 中提取当前用户和当前账户下的的日历条目,并将其导出为 CSV 文件。脚本利用 Outlook 的 COM 对象模型来访问日历数据。

建议运行脚本之前先运行此命令:Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force

广告
广告图片

1.1 加载 Outlook COM 对象

$Outlook = New-Object -ComObject Outlook.Application
$Namespace = $Outlook.GetNamespace("MAPI")
  • New-Object -ComObject Outlook.Application: 创建一个 Outlook 应用程序的 COM 对象实例。
  • GetNamespace("MAPI"): 获取 MAPI 命名空间,用于访问 Outlook 的数据存储。

1.2 获取日历文件夹

$CalendarFolder = $Namespace.GetDefaultFolder(9)  # 9 代表日历文件夹
  • GetDefaultFolder(9): 通过指定常量 9 获取默认的日历文件夹。

1.3 初始化数组存储日历条目

$CalendarItems = @()
  • 创建一个空数组 $CalendarItems 用于存储提取的日历条目。

1.4获取日历中的所有条目

$Items = $CalendarFolder.Items
$Items.IncludeRecurrences = $true  # 包含重复事件
  • $CalendarFolder.Items: 获取日历文件夹中的所有条目。
  • IncludeRecurrences = $true: 设置为 true 以确保包括重复事件。

1.5遍历条目并过滤

foreach ($Item in $Items) {
    if ($Item -is [Microsoft.Office.Interop.Outlook.AppointmentItem]) {
        $CalendarItems += New-Object PSObject -Property @{
            Subject             = $Item.Subject
            Start               = $Item.Start
            End                 = $Item.End
            Location            = $Item.Location
            RequiredAttendees   = $Item.RequiredAttendees
            Body                = $Item.Body
            IsRecurring         = $Item.IsRecurring
        }
    }
}
  • foreach ($Item in $Items): 遍历所有日历条目。
  • $Item -is [Microsoft.Office.Interop.Outlook.AppointmentItem]: 检查当前条目是否为日历事件(即 AppointmentItem)。
  • New-Object PSObject -Property @{ ... }: 创建一个自定义对象,提取并存储事件的相关信息(主题、开始时间、结束时间、地点、参与者、正文和是否重复)。

1.6导出到 CSV 文件

$DesktopPath = [Environment]::GetFolderPath("Desktop")
$CsvPath = Join-Path -Path $DesktopPath -ChildPath "CalendarExport.csv"
$CalendarItems | Export-Csv -Path $CsvPath -NoTypeInformation -Encoding UTF8
  • [Environment]::GetFolderPath("Desktop"): 获取用户桌面的路径。
  • Join-Path: 组合桌面路径和文件名形成完整的文件路径。
  • Export-Csv: 将收集到的日历条目导出为 CSV 文件,设置编码为 UTF-8。

1.7 输出导出结果

Write-Host "日历信息已导出到:$CsvPath"
  • Write-Host: 在控制台输出导出结果的路径,确认操作成功。

1.8导出当前用户日历信息代码

# 确保加载 Outlook COM 对象
Write-Host "建议运行此脚本之前先运行此命令:Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force"
# 如果需要,可以在此处将执行策略恢复为原始状态
# Set-ExecutionPolicy Default -Scope CurrentUser
$Outlook = New-Object -ComObject Outlook.Application
$Namespace = $Outlook.GetNamespace("MAPI")

# 获取当前用户的日历文件夹
$CalendarFolder = $Namespace.GetDefaultFolder(9)  # 9 代表日历文件夹

# 初始化一个数组用于存储日历条目
$CalendarItems = @()

# 获取日历中的所有条目
$Items = $CalendarFolder.Items
$Items.IncludeRecurrences = $true  # 包含重复事件

foreach ($Item in $Items) {
    # 跳过不是日历事件的条目
    if ($Item -is [Microsoft.Office.Interop.Outlook.AppointmentItem]) {
        # 创建自定义对象并添加到数组中
        $CalendarItems += New-Object PSObject -Property @{
            Subject             = $Item.Subject
            Start               = $Item.Start
            End                 = $Item.End
            Location            = $Item.Location
            RequiredAttendees   = $Item.RequiredAttendees
            Body                = $Item.Body
            IsRecurring         = $Item.IsRecurring
        }
    }
}

# 导出到桌面上的 CSV 文件
$DesktopPath = [Environment]::GetFolderPath("Desktop")
$CsvPath = Join-Path -Path $DesktopPath -ChildPath "CalendarExport.csv"
$CalendarItems | Export-Csv -Path $CsvPath -NoTypeInformation -Encoding UTF8

Write-Host "日历信息已导出到:$CsvPath"

导出当前账户所有日历信息代码解析

2.1加载 Outlook COM 对象

   $Outlook = New-Object -ComObject Outlook.Application
   $Namespace = $Outlook.GetNamespace("MAPI")
  • 这两行代码创建一个 Outlook 应用程序的实例,并获取 MAPI 命名空间,允许访问 Outlook 中的各种对象(如邮件、日历等)。

2.2初始化 ArrayList

   $CalendarItems = New-Object System.Collections.ArrayList
  • 创建一个 ArrayList,用于存储从日历中提取的所有事件信息。这种数据结构支持动态添加元素。

2.3导出日历条目函数

   function Export-CalendarItems($Folder) {
       $Items = $Folder.Items
       $Items.IncludeRecurrences = $true
       ...
   }
  • 该函数接收一个文件夹对象,获取其中的所有日历项。
  • IncludeRecurrences 设置为 true,以确保包括重复事件。

2.4处理每个日历事件

   foreach ($Item in $Items) {
       if ($Item -is [Microsoft.Office.Interop.Outlook.AppointmentItem]) {
           ...
       }
   }
  • 遍历文件夹中的每个项目,检查项目是否为日历事件(AppointmentItem)。
  • 如果是日历事件,则创建一个 PSObject,将事件的相关信息(如主题、开始时间、结束时间等)存储在其中。

2.5递归遍历文件夹

   function Get-AllCalendars($Folders) {
       foreach ($Folder in $Folders) {
           if ($Folder.Folders.Count -gt 0) {
               Get-AllCalendars $Folder.Folders
           }
           if ($Folder.DefaultItemType -eq [Microsoft.Office.Interop.Outlook.OlItemType]::olAppointmentItem) {
               Export-CalendarItems $Folder
           }
       }
   }
  • 该函数递归遍历所有文件夹及其子文件夹。
  • 如果当前文件夹包含子文件夹,递归调用自身以处理子文件夹。
  • 检查每个文件夹的 DefaultItemType,如果是日历文件夹,则调用 Export-CalendarItems 函数。

2.6获取所有日历文件夹

   $Folders = $Namespace.Folders
   Get-AllCalendars $Folders
  • 获取当前用户的所有文件夹,并调用 Get-AllCalendars 函数开始遍历。

2.7导出到 CSV 文件

   $DesktopPath = [Environment]::GetFolderPath("Desktop")
   $CsvPath = Join-Path -Path $DesktopPath -ChildPath "AllCalendarsExport.csv"
   $CalendarItems | Export-Csv -Path $CsvPath -NoTypeInformation -Encoding UTF8
  • 获取桌面的路径,构建 CSV 文件的完整路径。
  • 使用 Export-Csv 将收集到的日历信息导出到 CSV 文件中,使用 UTF-8 编码。

2.8输出结果

   Write-Host "所有日历信息已导出到:$CsvPath"
  • 将结果信息输出到控制台,告知用户导出完成及文件位置。

这段代码的主要功能是从 Outlook 中递归地提取所有日历文件夹及其事件信息,最后将这些信息导出到一个 CSV 文件。通过使用 ArrayList 处理动态数据,可以确保在提取大量日历事件时不会遇到数组大小限制的问题。

2.9导出当前账户下所有日历信息代码

# 确保加载 Outlook COM 对象
$Outlook = New-Object -ComObject Outlook.Application
$Namespace = $Outlook.GetNamespace("MAPI")

# 初始化一个 ArrayList 用于存储日历条目
$CalendarItems = New-Object System.Collections.ArrayList

# 函数:导出特定日历文件夹中的日历条目
function Export-CalendarItems($Folder) {
    $Items = $Folder.Items
    $Items.IncludeRecurrences = $true  # 包含重复事件

    foreach ($Item in $Items) {
        # 仅处理日历事件
        if ($Item -is [Microsoft.Office.Interop.Outlook.AppointmentItem]) {
            # 创建自定义对象
            $NewItem = New-Object PSObject -Property @{
                CalendarName       = $Folder.Name
                Subject            = $Item.Subject
                Start              = $Item.Start
                End                = $Item.End
                Location           = $Item.Location
                RequiredAttendees  = $Item.RequiredAttendees
                Body               = $Item.Body
                IsRecurring        = $Item.IsRecurring
            }
            # 使用 Add 方法添加新对象
            [void]$CalendarItems.Add($NewItem)
        }
    }
}

# 遍历所有文件夹,查找日历文件夹
function Get-AllCalendars($Folders) {
    foreach ($Folder in $Folders) {
        # 检查子文件夹
        if ($Folder.Folders.Count -gt 0) {
            Get-AllCalendars $Folder.Folders
        }
        # 查找日历文件夹
        if ($Folder.DefaultItemType -eq [Microsoft.Office.Interop.Outlook.OlItemType]::olAppointmentItem) {
            Export-CalendarItems $Folder
        }
    }
}

# 获取所有日历文件夹(包括共享日历)
$Folders = $Namespace.Folders
Get-AllCalendars $Folders

# 导出到桌面上的 CSV 文件
$DesktopPath = [Environment]::GetFolderPath("Desktop")
$CsvPath = Join-Path -Path $DesktopPath -ChildPath "AllCalendarsExport.csv"
$CalendarItems | Export-Csv -Path $CsvPath -NoTypeInformation -Encoding UTF8

Write-Host "所有日历信息已导出到:$CsvPath"

下载

当前用户:https://img.8i5.net/down/powershell/Current_User_Calendar.ps1

当前账户:https://img.8i5.net/down/powershell/all_calendars.ps1

广告
广告图片
温馨提示 : 非特殊注明,否则均为©李联华的博客网原创文章,本站文章未经授权禁止任何形式转载;来自:弗吉尼亚州·Ashburn ,欢迎您的访问!
文章链接:https://www.lilianhua.com/batch-export-of-current-user-and-all-calendar-information.html
请先登录才能参与答题
距本场结束剩 00 00 00 00
轻量应用服务器 2核2G
200M峰值带宽,适用于网站搭建、Web应用、容器环境、电商独立站等
立即前往
扫码进入
扫描二维码购买
文澜千文

文澜千文

请登录以使用此功能。

和情(LOTUS)Biscoff焦糖饼干小红盒750g送礼下午茶零食比利时原装进口 和情(LOTUS)Biscoff焦糖饼干小红盒750g送礼下午茶零食比利时原装进口
Loading...
OpenClaw

OpenClaw 龙虾

AI AGENT GATEWAY
在您的服务器部署 OpenClaw,打造专属极速 AI 助手。
零门槛一键部署环境
支持 QQ/飞书/微信 渠道
跨平台指令分发执行
立即安装