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

概述

这段 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

温馨提示 : 非特殊注明,否则均为©李联华的博客网原创文章,本站文章未经授权禁止任何形式转载;IP地址:3.137.169.14,归属地:俄亥俄州Dublin ,欢迎您的访问!
文章链接:https://www.lilianhua.com/batch-export-of-current-user-and-all-calendar-information.html
Popup Image

通知

本站原则上是免费提供技术支持,但是服务器维护和运营成本高,可以实行自由赞助:赞助

Loading...