1

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

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

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

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

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

我正在努力确定前者需要更长处理时间的具体原因。两种方法都不需要循环相同数量的对象吗?逐字符比较(for -like)与编译正则表达式的区别是什么?(用于匹配)

4

1 回答 1

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
于 2012-05-15T19:16:10.133 回答