首页 > 解决方案 > 用于提取 Outlook .msg 文件数据并使用 Msg 数据重命名 .msg 文件的 Powershell 脚本(例如,发送日期、主题)

问题描述

如果此请求位于错误的位置,请向 Stackoverflow 致歉。

我也是 PowerShell 的新手,并且一直在研究似乎由 PowerShell 提供的解决方案。我缺乏经验使我无法修改示例脚本,所以我在这里寻求帮助。

我的目标是使用从每个 .msg 文件中提取的数据重命名位于文件夹和子文件夹中的许多 Outlook .msg 文件。就我而言,我需要发送日期(Senton)(和主题,但不太重要)。目前,这很痛苦,是手动完成的,需要很长时间,所以我认为我们需要一些东西来半自动化解决方案。

我在各种论坛和博客上四处搜索,发现了一个似乎朝着我想要的方向发展的脚本(详情如下),但我只是没有技能来完成最后一点的发送日期和更改.msg 文件名。我尝试了各种引用变量 $msg.Seton 的管道解决方案。PowerShell 调试器表明带有注释“我的代码更改”的行具有良好的值,但会为每个对象迭代产生错误(与参数 NewName 相关)(见下文)。

任何有助于取得进展的帮助将不胜感激。同时,我将继续试验调试器。

该脚本来自此(http://jon.glass/blog/reads-e-mail-with-powershell/)站点,脚本看起来像......

Get-ChildItem "C:\Users\higginsr4\Test\StudyExamples\SmallMsgFolder" -Filter *.msg|
ForEach-Object{
    $outlook = New-Object -comobject outlook.application
    $msg = $outlook.CreateItemFromTemplate($_.FullName)
    $msg | Select senderemailaddress,to,subject,Senton,body|ft -AutoSize
    $msg | Rename-Item -NewName { $msg.Senton + $_.name} ## My code changes
    }

PowerShell 调试器错误...

重命名项目:参数“NewName”的脚本块输入失败。无法将“op_Addition”的参数“1”,值为“”转换为“System.TimeSpan”类型:“无法将 null 转换为“System.TimeSpan”类型。” 在我的文档\WindowsPowerShell\Modules\GetEmailDetails\RobsGetEmailDetails.ps1:6 char:33 + $msg | 重命名项目 -NewName { $msg.Senton + $_.name} + ~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (System.__ComObject :__ComObject) [Rename-Item], ParameterBindingException + FullyQualifiedErrorId : ScriptBlockArgumentInvocationFailed,Microsoft.PowerShell.Commands.RenameItemCommand

我使用的是 Windows 7 企业版,但如果需要更多详细信息,请告诉我。

标签: powershell

解决方案


在您尝试过的事情中要强调的几件事:-

  1. $msg是由基本类型创建的 ComObject,System.MarshalByRefObject而不是实际的物理文件。因此,你在某种程度上偏离了你的目标。

  2. 您正在将-NewName参数包含在脚本块中。Get-ChildItem请注意,当您通过管道传输to的输出时,您已经完成了该操作Foreach-Object。因此,额外的脚本块是多余的。

你可以做这样的事情 -

Get-ChildItem "C:\Users\higginsr4\Test\StudyExamples\SmallMsgFolder" -Filter  *.msg |
ForEach-Object{
    $outlook = New-Object -comobject outlook.application
    $msg = $outlook.CreateItemFromTemplate($_.FullName)
    $msg | Select senderemailaddress,to,subject,Senton,body|ft -AutoSize
    Rename-Item -LiteralPath $_.FullName -NewName "$($_.Basename)_$($msg.Senton.ToString('ddMMyy')$($_.Extension)"
    }

推荐阅读