我有一个简单的Powershell脚本,该脚本使用一些过滤器收集Exchange邮件跟踪结果,然后返回主题中带有“* SPAM *”的项目。为此,我采用了Microsoft.Exchange.Management.TransportLogSearchTasks.MessageTrackingEvent对象的数组,并将其通过管道传递到“地方”,该地方检查每个条目的MessageSubject属性。

我发现,当我使用以下内容比较MessageSubject属性时,该代码需要极长的时间(小时)来完成约70,000条记录:

($ _。messagesubject -like'`* SPAM` *')

但是,当我使用以下命令时,完成时间以秒为单位:

($ _。messagesubject -match [regex]'^ \ * SPAM \ *。* $')

我想知道前者需要花费更长的时间来处理的具体原因。两种方法都不需要遍历相同数量的对象吗?逐字符比较(对于类似字符)与已编译正则表达式的区别是吗? (用于-match)

最佳答案

您确定切换操作员是唯一在版本之间进行更改的东西吗?根据以下测试,操作员的性能不是问题。而且,正则表达式转换是最长的。我也认为您使用的like模式是错误的,您需要对星号进行转义,因为它们是特殊的通配符(请参阅$ sb4)。

PS> $msg = "just a sample spam message for testing"

PS> $sb1 = { 1..70000 | foreach {$msg -match [regex]'^\*SPAM\*.*$' } }
PS> $sb2 = { 1..70000 | foreach {$msg -match 'spam'} }
PS> $sb3 = { 1..70000 | foreach {$msg -like "*spam*" } }
PS> $sb4 = { 1..70000 | foreach {$msg -like "`*spam`*" } }

PS> (measure-command $sb1).TotalSeconds
8.1869412

PS> (measure-command $sb2).TotalSeconds
6.7244995

PS> (measure-command $sb3).TotalSeconds
7.9287195

PS> (measure-command $sb4).TotalSeconds
6.9678701

10-08 00:18