Scripting Guy 為您解答問題

Hey, Scripting Guy!

歡迎使用 TechNet 專欄,Microsoft Scripting Guy 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

資源

如何刪除 [寄件備份] 資料夾中的所有郵件?

Hey, Scripting Guy! Question

嗨,Scripting Guy!如何刪除 [寄件備份] 資料夾中的所有郵件?

        -- OG

Hey, Scripting Guy! Answer

OG,您好。其實,撰寫這個專欄的 Scripting Guy 常常被告知一個觀念:「沒有人問過的問題才是蠢問題」。但是,老實說,他並不相信這點。舉例來說,當 Doug Williams 成為第一位帶領球隊打入「超級杯足球聯賽」的黑人四分衛時,就有人問過他一個經典問題:「你當黑人四分衛多久了?」

看來,也有人支持「不只是沒人問過的問題才是蠢問題」這個論點。

不過,可以確信的是,沒有人問過的問題一定不會有答案。當然,如果您是《嗨,Scripting Guy!》專欄的忠實讀者,那就另當別論。在《嗨,Scripting Guy!》中,我們不僅會回答有人詢問的問題 (反正,遲早會有人問),而且還會回答沒人詢問的問題。例如什麼問題呢?答案如下:是的,您現在可以開始準備「2007 冬季指令碼比賽 (英文)」了。

沒錯,「2007 冬季指令碼比賽」是由 Script Center 舉辦 (2007 年 2 月 12-23 日),而且今年的比賽規模比以往更大更好:不僅比往年規劃更多項目,而且還有更多分組比賽 (VBScript 初學組、VBScript 進階組、Windows PowerShell 初學組和 Windows PowerShell 進階組)。對了,我們有沒有提過今年會提供獎品,其中某些獎品尚未宣佈,而某些獎品則已經公佈?而且 -- 請站穩啦 -- 這些已宣佈的獎品包括 250 個 Dr. Scripto 搖頭玩偶 (英文)

附註:說的好:Dr.Scripto 搖頭玩偶一詞是不是有點多餘?

最棒的是,您只需要至少參加其中一個項目就有機會贏得大獎,甚至不需要順利完成項目。您可以嘗試為其他主要比賽命名;在這個項目裡,他們會隨機選擇得獎者!

好吧,我們指的是除了花式溜冰以外。

當然,如果您的個性和 Scripting Guy 相似,您可能會將訓練課程拖到最後一刻,然後突然才驚覺「指令碼比賽」開始的日期就要到了。但是,請盡量放輕鬆。您還沒準備好參加比賽嗎?那麼,請下載正式的指令碼比賽計劃 (英文),其內容包含技巧和秘訣、範例項目,以及一組專門讓您為比賽暖身而設計的填字猜謎。您是指令碼初學者嗎?那麼,請看一下有關處理陣列的特別訓練文章 (英文)。今年,您再也沒有任何藉口可以不至少嘗試參加「指令碼比賽」其中一項比賽了。

不好意思:不要再找藉口。

好了,既然我們已經處理過沒有人問的問題,接下來我們就可以處理某人問過的問題了。OG,您說您需要刪除 [寄件備份] 資料夾中的所有郵件嗎?下面這一小段指令碼應該可以完成這項作業:


Const olFolderSentMail  = 5

Set objOutlook = CreateObject("Outlook.Application")
Set objNamespace = objOutlook.GetNamespace("MAPI")

Set objFolder = objNamespace.GetDefaultFolder(olFolderSentMail)

Set colItems = objFolder.Items

For i = colItems.Count to 1 Step - 1
    colItems(i).Delete
Next


這段指令碼如何運作呢?哇!這是我們今天要回答的另一個問題。首先,我們要建立一個名為 olFolderSentMail 的常數,並將其值設為 5 (我們將要使用這個常數來告訴指令碼,我們想要連接的 Outlook 資料夾)。在定義這個常數之後,我們要建立 Outlook.Application 物件的執行個體,然後使用 GetNamespace 方法,讓我們繫結至 MAPI 命名空間。一旦這個步驟完成之後,我們要使用 GetDefaultFolder 方法來連接至 [寄件備份] 資料夾,就像這樣:


Set objFolder = objNamespace.GetDefaultFolder(olFolderSentMail)


然後,一旦該項作業完成之後,我們要使用下面這行程式碼來傳回 [寄件備份] 資料夾中找到的所有郵件集合:


Set colItems = objFolder.Items


這下奇怪的地方來了 (也沒有那麼怪啦)。我們只需要針對集合中的所有項目執行迴圈並加以刪除即可 (我們通常會設定 For Each 迴圈來進行這項作業)。不過,在 Outlook 中,這樣做沒有用。所以,當我們要刪除項目時,必須改為指定每個項目的索引編號。此外,如果您嘗試刪除第一則郵件、然後第二則郵件,接著第三則郵件,通常就會遇到問題 (因故不深入探討)。我們必須改為從最後一則郵件開始刪除,然後倒數第二則郵件,依此類推。這就是下列迴圈看起來有點奇怪的原因:


For i = colItems.Count to 1 Step - 1
    colItems(i).Delete
Next


如您所見,這個迴圈會逆向執行 (Step -1),從資料夾中郵件的總數 (我們可以使用 Count 屬性來判斷的值) 到資料夾中的第一則郵件 (項目 1)。當您每次從集合中刪除某則郵件時,集合中的個別項目就會重新編號,而上述項作業就與這點有關。因此,如果我們從第 1 則郵件開始向下執行,最多只能刪除一半的項目。如果我們從底部開始向上執行,就可以刪除所有項目。

我們知道您目前的想法。但是只要您自己試試看,就知道我們的意思了。

反正,這樣就沒問題了,OG。我們希望上述內容對您有所幫助,而且希望能在「指令碼比賽」中看到您和其他人。

附註:您說得一點都沒錯!刪除 Outlook 資料夾中的所有項目應該可以成為不錯的「指令碼比賽」項目。討厭!現在才想到太慢了啦?


顯示: