Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Powershell在Outlook中降低输出速度_Powershell_Outlook - Fatal编程技术网

通过Powershell在Outlook中降低输出速度

通过Powershell在Outlook中降低输出速度,powershell,outlook,Powershell,Outlook,我正在使用Powershell通过创建COM对象来访问Outlook邮件。 当我搜索特定邮件时。PowerShell会遍历所有邮件,因此我的输出结果非常慢,而且耗时很长 我已经尝试过在排序对象中使用降序参数或按日期过滤,但结果仍然很慢 $outlook = New-Object -comobject outlook.application $inbox = $outlook.GetNamespace("MAPI") $find = $inbox.GetDefaultFolder(6) $find

我正在使用Powershell通过创建COM对象来访问Outlook邮件。 当我搜索特定邮件时。PowerShell会遍历所有邮件,因此我的输出结果非常慢,而且耗时很长

我已经尝试过在排序对象中使用降序参数或按日期过滤,但结果仍然很慢

$outlook = New-Object -comobject outlook.application
$inbox = $outlook.GetNamespace("MAPI")
$find = $inbox.GetDefaultFolder(6)
$find.Items | Where-Object{$_.SentOn -gt '27-Oct-2019 12:00 PM'}| Select- 
Object -Property Subject,SentOn

请有人帮助我生成更快的结果,或者提供一种方法来筛选特定时间段的搜索。

不要循环查看代码中的所有项目。毕竟,如果没有WHERE子句,您不会在SQL中编写SELECT查询,是吗


使用Items.Find/FindNext或Items.Restrict让存储提供商执行此任务。

切勿循环查看代码中的所有项目。毕竟,如果没有WHERE子句,您不会在SQL中编写SELECT查询,是吗


使用Items.Find/FindNext或Items.Restrict让商店提供商来完成这项工作。

从@bluf的评论中,我查看了EWS exchange web服务并提出了此解决方案,它比您的脚本快了大约50%。。也许对你有帮助

$startDate = Get-Date
$MailboxSMTP = "peter.parker@home.com"  
$dllpath = "C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\Mashup\Microsoft.Exchange.WebServices.dll"
[void][Reflection.Assembly]::LoadFile($dllpath)

$service = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP1)
$service.UseDefaultCredentials = $true
$service.AutodiscoverURL($mailboxSMTP)

$mbMailbox = new-object Microsoft.Exchange.WebServices.Data.Mailbox($mailboxSMTP)

$inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)
write-host "Number or unread Messages : " $inbox.UnreadCount 

$emails = $inbox.FindItems(10000) | Where-Object { $_.DateTimeSent -gt '27-Oct-2019 12:00 PM'}
$endDate = Get-Date

New-TimeSpan -Start $startDate -End $endDate
在这里找到脚本

编辑:

您可以使用EWS以与@Dmitry solution中类似的方式过滤结果

write-host "Number or unread Messages : " $inbox.UnreadCount 

$view = New-Object Microsoft.Exchange.WebServices.Data.ItemView(1)
$x = $inbox.FindItems($(New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsGreaterThanOrEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::DateTimeReceived, '2019-10-27')),$view)
或者您可以使用它来过滤不同的属性

$filter = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::IsRead, $false)


从@bluf的评论中,我查看了EWS exchange web服务,并提出了此解决方案,它比您的脚本快了大约50%。。也许对你有帮助

$startDate = Get-Date
$MailboxSMTP = "peter.parker@home.com"  
$dllpath = "C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\Mashup\Microsoft.Exchange.WebServices.dll"
[void][Reflection.Assembly]::LoadFile($dllpath)

$service = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP1)
$service.UseDefaultCredentials = $true
$service.AutodiscoverURL($mailboxSMTP)

$mbMailbox = new-object Microsoft.Exchange.WebServices.Data.Mailbox($mailboxSMTP)

$inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)
write-host "Number or unread Messages : " $inbox.UnreadCount 

$emails = $inbox.FindItems(10000) | Where-Object { $_.DateTimeSent -gt '27-Oct-2019 12:00 PM'}
$endDate = Get-Date

New-TimeSpan -Start $startDate -End $endDate
在这里找到脚本

编辑:

您可以使用EWS以与@Dmitry solution中类似的方式过滤结果

write-host "Number or unread Messages : " $inbox.UnreadCount 

$view = New-Object Microsoft.Exchange.WebServices.Data.ItemView(1)
$x = $inbox.FindItems($(New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsGreaterThanOrEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::DateTimeReceived, '2019-10-27')),$view)
或者您可以使用它来过滤不同的属性

$filter = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::IsRead, $false)


如果您对收件箱中的邮件进行排序,这不会改变powershell必须浏览所有电子邮件的事实。我猜你的收件箱里有很多电子邮件?如果我在我的系统上用少于100封邮件运行你的代码,只需要0.5秒…@Dan有什么方法可以快速获得结果,或者我的脚本可以从最新邮件迭代到旧邮件?Outlook COM界面非常慢。如果您使用的是Exchange服务器,则可以使用性能非常好的EWS。这与COM接口没有多大关系。使用文件夹过滤器。如果您对收件箱中的邮件进行排序,这不会改变powershell必须浏览所有电子邮件的事实。我猜你的收件箱里有很多电子邮件?如果我在我的系统上用少于100封邮件运行你的代码,只需要0.5秒…@Dan有什么方法可以快速获得结果,或者我的脚本可以从最新邮件迭代到旧邮件?Outlook COM界面非常慢。如果您使用的是Exchange服务器,则可以使用性能非常好的EWS。这与COM接口没有多大关系。使用文件夹过滤器。查找和限制似乎只使用字符串来过滤电子邮件。。是否可以使用这些功能按日期过滤电子邮件?当然,您也可以使用datetime属性,例如[ReceivedTime]<'10/29/2019',这太棒了。不知道你可以像这样使用它$x=$find.Items.find[SentOn]<'2019年10月29日',它的速度非常快。只花了18毫秒,而我的解决方案仍然需要180毫秒左右。。。你已经得到了我的upvoteFind和Restrict,似乎只使用字符串来过滤电子邮件。。是否可以使用这些功能按日期过滤电子邮件?当然,您也可以使用datetime属性,例如[ReceivedTime]<'10/29/2019',这太棒了。不知道你可以像这样使用它$x=$find.Items.find[SentOn]<'2019年10月29日',它的速度非常快。只花了18毫秒,而我的解决方案仍然需要180毫秒左右。。。你已经得到我的选票了