请求编写PowerShell脚本提取并重命名Outlook .msg文件附件
PowerShell批量提取Outlook .msg文件附件并重命名方案
以下是完全符合你需求的PowerShell脚本,只需简单修改文件夹路径就能直接使用:
# 设置要处理的.msg文件所在文件夹路径,替换成你的实际路径 $folderPath = "C:\Path\To\Your\Msg\Files" # 创建Outlook应用对象 $outlook = New-Object -ComObject Outlook.Application # 遍历文件夹中的所有.msg文件 Get-ChildItem -Path $folderPath -Filter *.msg | ForEach-Object { $msgFile = $_ $msgFileName = $msgFile.BaseName # 获取不带后缀的原邮件文件名 Write-Host "正在处理: $($msgFile.Name)" try { # 打开.msg文件 $mailItem = $outlook.Session.OpenSharedItem($msgFile.FullName) $totalAttachments = $mailItem.Attachments.Count if ($totalAttachments -eq 0) { Write-Host " 该邮件无附件,跳过" $mailItem.Close(1) # 1 = olDiscard,不保存关闭 return } # 逐个处理附件 for ($i = 1; $i -le $totalAttachments; $i++) { $attachment = $mailItem.Attachments.Item($i) $fileExtension = [System.IO.Path]::GetExtension($attachment.FileName) # 构造新文件名:原邮件文件名_attach X of Y.原后缀 $newFileName = "$msgFileName`_attach $i of $totalAttachments$fileExtension" $savePath = Join-Path -Path $folderPath -ChildPath $newFileName # 保存附件 $attachment.SaveAsFile($savePath) Write-Host " 已保存附件: $newFileName" } # 关闭邮件,不保存更改 $mailItem.Close(1) } catch { Write-Host " 处理失败: $_" # 确保出错时也关闭邮件对象 if ($mailItem) { $mailItem.Close(1) } } } # 释放Outlook COM对象 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($outlook) | Out-Null Remove-Variable outlook Write-Host "所有文件处理完成"
使用步骤
- 打开PowerShell(无需管理员权限,但要确保Outlook已关闭)
- 执行以下命令允许脚本运行(仅需执行一次):
按提示输入Set-ExecutionPolicy RemoteSigned -Scope CurrentUserY确认即可。 - 将上面的脚本复制到记事本,把
$folderPath的值改成你的.msg文件所在文件夹的实际路径(比如"D:\Work\Emails") - 保存文件为
ExtractMsgAttachments.ps1(注意保存类型选「所有文件」,避免变成.txt) - 在PowerShell中导航到脚本所在文件夹,执行:
.\ExtractMsgAttachments.ps1
关键说明
- 脚本会自动跳过无附件的邮件
- 每一步操作都会在控制台输出状态,方便你跟踪进度
- 出错时会显示错误信息,且不会中断整个批量处理流程
- 处理完成后会自动释放Outlook的COM对象,避免占用系统资源
内容的提问来源于stack exchange,提问作者Scuzzle1234
相关产品推荐
相关产品推荐

