如何用PowerShell下载Outlook指定文件夹中最新邮件的附件?
问题分析与解决
你的报错核心是最后一行代码逻辑错误:Select-Object用于筛选对象属性,不能用来调用SaveAsFile方法;同时SaveAsFile需要传入完整文件路径(文件夹+附件文件名),仅传文件夹路径会导致方法调用失败。
修正后的完整代码
$outlook = New-Object -ComObject outlook.application $mapi = $outlook.GetNamespace("MAPI"); # 附件保存路径 $filePath = "C:\Temp\test" # 确保保存文件夹存在,不存在则创建 if (-not (Test-Path -Path $filePath)) { New-Item -Path $filePath -ItemType Directory | Out-Null } $inbox = $mapi.GetDefaultFolder(6) $olFolderPath = "\\DanielMol@sodastream.com\Inbox\compliance" # 获取目标文件夹 $targetFolder = $inbox.Folders | Where-Object { $_.FolderPath -eq $olFolderPath } # 按接收时间倒序排序邮件 $emails = $targetFolder.Items | Sort-Object ReceivedTime -Descending # 处理最新邮件的附件 if ($emails.Count -gt 0) { $latestEmail = $emails[0] foreach ($attachment in $latestEmail.Attachments) { # 拼接完整的保存路径:文件夹+附件名 $savePath = Join-Path -Path $filePath -ChildPath $attachment.FileName # 保存附件 $attachment.SaveAsFile($savePath) Write-Host "已保存附件:$savePath" } } else { Write-Host "目标文件夹中没有邮件" } # 释放Outlook COM对象(避免进程残留) [System.Runtime.Interopservices.Marshal]::ReleaseComObject($outlook) | Out-Null
关键修正点
- 新增文件夹存在性检查:防止因文件夹不存在导致保存失败
- 替换错误的
Select-Object为foreach循环:遍历每个附件并调用SaveAsFile方法 - 使用
Join-Path拼接完整路径:确保SaveAsFile拿到正确的文件路径 - 增加空邮件判断:避免目标文件夹无邮件时出现索引越界错误
- 新增COM对象释放:防止PowerShell进程残留Outlook实例
内容的提问来源于stack exchange,提问作者Danny Moulier
相关产品推荐
相关产品推荐

