使用Powershell脚本提取Outlook .msg文件数据并使用Msg数据(例如,发送日期,主题)重命名.msg文件

时间:2018-07-26 09:02:35

标签: powershell

对于传递给Stackoverflow的新手,如果此请求的位置错误,我们深表歉意。

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

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

我在各种论坛和博客中进行了搜索,发现一个脚本似乎正朝着我想要的方向前进(以下详细信息),但我只是不具备执行发送日期的最后一刻的技能并更改.msg文件名。我尝试了各种涉及变量$ msg.Senton的管道解决方案。 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调试器错误...

  

Rename-Item:参数'NewName'的脚本块输入失败。无法将“ op_Addition”的参数“ 1”转换为值“”,以将“ op_Addition”键入“ 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 Enterprise,但是如果需要更多详细信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

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

  1. $msg是由基本类型System.MarshalByRefObject创建的ComObject,而不是实际的物理文件。因此,您有点偏离目标。

  2. 您正在脚本块中包含-NewName参数。请注意,将Get-ChildItem的输出通过管道传输到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)"
    }