2012-05-15 50 views
1

我有收集Exchange郵件跟蹤使用一些過濾的結果,然後在主題「* SPAM *」的項目返回一個簡單的PowerShell腳本。要做到這一點,我採取Microsoft.Exchange.Management.TransportLogSearchTasks.MessageTrackingEvent對象和管它的一個「地點」的陣列,它檢查每個條目的屬性MessageSubject。PowerShell的條件效率:-match與樣

我發現,當我用比較MessageSubject屬性下面,代碼需要一個非常長的時間(小時)完成〜70000次的記錄:

($ _ messagesubject樣「`* SPAM '* ')

然而,當我使用下面的完成時間以秒爲單位。

($ _ messagesubject -match [正則表達式]'^\ * SPAM \ *。* $「)

我得到在我頭上試圖確定具體原因FO rmer需要很長的時間來處理。兩種方法都不需要遍歷相同數量的對象嗎?字符之間的比較(類似於)與編譯的正則表達式有何不同? (對於-match)

+4

首先,你的正則表達式不等於通配符。 '^ \ *'表示一行開頭的星號。等效的正則表達式模式只是'垃圾郵件'。 –

+0

我本來應該更清楚:電子郵件的主題總是以\ * SPAM開始\ *。 – visualtrey

回答

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 
+0

這是我原來的帖子中的錯誤:通配符被轉義。我將在我的設置中使用measure-command嘗試兩次迭代。 – visualtrey

+0

我發現了與您相似的結果。實際上影響我的腳本運行時間的是另一個從列表中選擇唯一對象的命令。不過謝謝你的迴應。 – visualtrey