Powershell 从特定Outlook文件夹中最近收到的电子邮件中获取文件

Powershell 从特定Outlook文件夹中最近收到的电子邮件中获取文件,powershell,outlook,etl,Powershell,Outlook,Etl,我要搜索特定的Outlook文件夹,查找最近发送的电子邮件,并将其附件保存到特定目录 我写了下面的脚本,但它不起作用。有人能建议需要改变什么才能使它工作吗 另外,在哪里可以找到我可以在PowerShell中使用的Outlook和Office特定方法和属性的列表?我尝试过谷歌搜索,但找不到官方的MSDN页面 #file path $filepath = “C:\folder” $account = "JonDoe@company.com" #set outlook to open $o = Ne

我要搜索特定的Outlook文件夹,查找最近发送的电子邮件,并将其附件保存到特定目录

我写了下面的脚本,但它不起作用。有人能建议需要改变什么才能使它工作吗

另外,在哪里可以找到我可以在PowerShell中使用的Outlook和Office特定方法和属性的列表?我尝试过谷歌搜索,但找不到官方的MSDN页面

#file path
$filepath = “C:\folder”
$account = "JonDoe@company.com"

#set outlook to open
$o = New-Object -comobject outlook.application
$n = $o.GetNamespace(“MAPI”)


$Account = $n.Folders | ? { $_.Name -eq $account };
    $f = $Account.Folders | ? { $_.Name -match 'FolderNameToSearch' };


$date = $f.Items| Select-Object -Property ReceivedTime | Sort-Object ReceivedTime -Descending | Select-Object -Index 0

#Write-Host $date


$f.Items | foreach 
{
   if ($_.ReceivedTime -match $date )
   {
        $_.attachments | foreach 
        {
            #Write-Host $_.filename
            $a = $_.filename
            $_.saveasfile((Join-Path $filepath $a))
        }
   }
}
编辑3/4/14-我仔细检查了脚本,我认为它在
$\uuu上失败了。ReceivedTime-match$date

我添加了以下代码来测试电子邮件
ReceivedTime
日期戳与
$date
存储的日期戳的值:

Write-Host "The date I am looking for is $date"

$f.Items | foreach {
   Write-Host $_.ReceivedTime
}
这是输出的一部分:

The date I am looking for is @{ReceivedTime=03/04/2014 03:16:08}
3/4/2014 3:16:08 AM

即使日期相同,数据类型也不同。将
$date
转换为datetime或将datetime转换为datetime最优雅的方法是什么?

首先,您太努力了。你在邮件中循环两次寻找完全相同的邮件,这是多余的。其次,
Get Date
是你的朋友,但你甚至不需要它。如果你真的,真的,真的想对邮件进行排序,并选择第一封邮件的日期/时间,然后根据这一日期/时间进行过滤,我想你可以,下面是你想要的:

if ((get-date $_.ReceivedTime) -eq (get-date $date))
我认为更好的解决方案是替换:

$date = $f.Items| Select-Object -Property ReceivedTime | Sort-Object ReceivedTime -Descending | Select-Object -Index 0
与:

然后你可以做如下事情:

Write-Output "Last email received at $($email.receivedtime), attached file(s) are: (if any)
$email.attachments|%{Write-Output $_.filename}


就个人而言,我会添加一个
If($email.attachments.count-gt 0){Do Stuff}或者{Write Output“最新的电子邮件在$($email.receivedtime)没有附件!”}
位。

在脚本的什么地方它偏离了你期望它做的事情?您可能希望在PowerShell ISE中运行它。设置一些断点并检查变量的内容,看看它们是否符合预期。你不能指望我们为你调试脚本。我们有自己无聊的调试工作要做。小心智能引号…@Trevor,智能引号对PowerShell来说似乎不是问题。它们看起来就像是普通的双引号。伙计们,请看我的编辑。我真的很感谢你花时间帮助我。先生,请接受我的建议。你能推荐一个学习PowerShell的好参考吗?你有推荐书吗?你已经回复了我的几篇帖子,我想告诉你,我真的很感谢你的帮助。老实说,我还没有读过一本书。我读过好几篇关于“嘿,脚本编写人”的文章,我过去经常关注MoW的博客,我对谷歌很在行;但恐怕我只是自学成才。对不起,在这件事上我帮不了你。我可以建议做一些事情,比如
$o | gm
,然后查看对象类型,并使用谷歌搜索“msdn Microsoft.Office.Interop”或“msdn Outlook.ApplicationClass”来查找内容。顺便说一句,我很乐意提供帮助,至少你似乎先尝试自己解决问题,而不仅仅是期望得到填鸭式的答案。我将研究那些博客和探索技术。再次感谢!
Write-Output "Last email received at $($email.receivedtime), attached file(s) are: (if any)
$email.attachments|%{Write-Output $_.filename}
$email.attachments|%{$_.saveasfile((join-path $folder $_.filename))