我有一个简单的Powershell脚本,它使用一些过滤器收集Exchange邮件跟踪结果,然后使用' * SPAM *'在这个主题。为此,我获取一个Microsoft.Exchange.Management.TransportLogSearchTasks.MessageTrackingEvent对象的数组,并将其传递给'其中'检查每个条目的MessageSubject属性。
我发现当我使用以下内容来比较MessageSubject属性时,代码需要很长的时间(小时)来完成约70,000条记录:
($ _。Messagesubject -like'`* SPAM` *')
但是当我使用以下内容时,完成时间以秒为单位:
($ _。messagesubject -match [regex]' ^ \ * SPAM \ *。* $')
我试图确定前者花费这么长时间来处理的具体原因。不要两种方法都需要循环相同数量的对象吗?逐字符比较(for -like)与编译正则表达式的区别是什么? (for -match)
答案 0 :(得分:7)
您确定切换操作符是版本之间唯一的变化吗?根据以下测试,运营商的表现不是问题。而且,正则表达式是最长的。我也相信你使用的模式是错误的,你需要逃避星号,因为它们是特殊的通配符(参见$ 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