Exchange 2016通过PowerShell+EWS导出约会到CSV遇问题求助
Exchange 2016 EWS导出约会CSV问题解决方法
一、CSV导出失效问题解决
问题根源
你尝试的三种方法失效的核心原因是没有将约会数据封装为结构化的自定义对象:
Out-File -Append:仅适合输出文本内容,直接输出EWS约会对象会打印对象类型而非属性值,导致无有效输出。Export-Csv -Append停滞:未正确传递结构化对象,而是传入了字符串或非对象类型,触发InputObject交互提示。- 导出得到Length字段:存入
$Output的是字符串数组,Export-Csv仅识别字符串的Length属性,而非你需要的约会信息。
解决步骤
- 构造自定义对象:每次获取约会后,将需要的属性封装为
PSCustomObject,确保数据结构清晰。 - 正确调用Export-Csv:将自定义对象通过管道传递给
Export-Csv,指定路径、-Append和-NoTypeInformation参数。
示例代码片段:
# 遍历约会时构造自定义对象 foreach ($item in $calendarItems) { if ($item -is [Microsoft.Exchange.WebServices.Data.Appointment]) { $exportObj = [PSCustomObject]@{ Subject = $item.Subject Start = $item.Start.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") End = $item.End.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") Location = $item.Location Organizer = $item.Organizer.Name } # 导出到CSV $exportObj | Export-Csv -Path "C:\Appointments.csv" -Append -NoTypeInformation -Encoding UTF8 } }
二、空Location报错问题解决
问题根源
当约会的Location属性为null时,直接引用该属性可能触发空值引用错误,尤其是在某些需要字符串操作的场景中。
解决方法
在构造自定义对象时,对Location做空值判断,赋予默认空字符串:
# 方式1:if-else判断 $location = if ($item.Location) { $item.Location } else { "" } # 方式2:强制转换为字符串(null转字符串自动为空) $location = [string]$item.Location # 方式3:PowerShell 7+可使用空合并运算符 $location = $item.Location ?? ""
将上述处理后的$location代入自定义对象即可避免报错。
完整修正脚本示例
# 初始化EWS服务(假设已完成身份验证) $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2016) $service.Credentials = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials("username", "password") $service.Url = New-Object Uri("https://your-exchange-server/EWS/Exchange.asmx") # 指定目标邮箱和日历文件夹 $mailboxName = "target-user@domain.com" $calendarFolderId = New-Object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar, $mailboxName) $calendarFolder = [Microsoft.Exchange.WebServices.Data.CalendarFolder]::Bind($service, $calendarFolderId) # 设置ItemView获取约会 $itemView = New-Object Microsoft.Exchange.WebServices.Data.ItemView(1000) $itemView.PropertySet = New-Object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties) $calendarItems = $calendarFolder.FindItems($itemView) # 初始化CSV文件(确保表头仅写入一次) $outputPath = "C:\Exchange_Appointments.csv" if (-not (Test-Path $outputPath)) { [PSCustomObject]@{ Subject = "" Start = "" End = "" Location = "" Organizer = "" } | Export-Csv -Path $outputPath -NoTypeInformation -Encoding UTF8 } # 遍历并导出约会 foreach ($item in $calendarItems) { if ($item -is [Microsoft.Exchange.WebServices.Data.Appointment]) { # 处理空Location $location = [string]$item.Location $exportObj = [PSCustomObject]@{ Subject = $item.Subject Start = $item.Start.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") End = $item.End.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") Location = $location Organizer = $item.Organizer.Name } $exportObj | Export-Csv -Path $outputPath -Append -NoTypeInformation -Encoding UTF8 } }
内容的提问来源于stack exchange,提问作者Stefanski
相关产品推荐
相关产品推荐

