嗨,Scripting Guy!

嗨,Scripting Guy!

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

還有,別忘了瞧瞧全新經過改良的《嗨,Scripting Guy!過往文件》。

今天的問題:我要如何找出電腦中前 20 大的檔案呢?


我要如何找出電腦中前 20 大的檔案呢?

嗨,Scripting Guy!我要如何找出電腦中前 20 大的檔案呢?

-- PW

PW,您好。撰寫這篇文章的 Scripting Guy 最近從歐洲度假回來,真切感受到所謂大千世界。有些風俗民情還是很難調適。在餐廳點了一杯汽水,結果來的是超小杯又沒有加冰塊的飲料,又不能以免費續杯,真是違反人道。不過其他的東西,像是每年有 6-8 週的給薪假期,倒是不錯。我的重點並不是要說誰好 (可麗餅薄餅上淋香濃巧克力醬) 或是誰不好 (填滿著–這可不是我們瞎編出來的–蝸牛的酥皮點心)。而是想說嘗試不同事物是沒關係的。

說來說去只是想找到合理的藉口,這次我們決定不再提供您作業系統內建的解決方案。理論上,只要使用 WMI 在就可以取決電腦內前 20 大的檔案,然而編寫這個指令碼相當麻煩,而且可能一輩子都執行不完。(正巧和在巴黎用完餐後,等待侍者把帳單拿來的時間一樣漫長。)如果只有 WMI 這麼一個辦法可以找出前 20 大檔案,那我們乾脆撞牆好了。幸好有個更簡潔的方法:下載、安裝及使用Log Parser 2.2

如果您還不熟悉 Log Parser 2.2,請您參閱《指令碼的物語》(英文) 專欄。Log Parser 是一種輕巧好用的公用程式,名符其實,它可以快速簡單地剖析純文字記錄檔。而且 Log Parser 也可以用來快速簡單地剖析事件記錄、檔案系統、登錄,甚至是 Active Directory。在您已安裝 Log Parser 之後,只消幾分鐘就可以擷取 (並排序) 電腦上前 20 大檔案,用上的指令碼不過如此:

Set objLogParser = CreateObject("MSUtil.LogQuery")
Set objInputFormat = CreateObject("MSUtil.LogQuery.FileSystemInputFormat")
objInputFormat.Recurse = -1
Set objOutputFormat = CreateObject("MSUtil.LogQuery.NativeOutputFormat")
objOutputFormat.rtp = -1
strQuery = "SELECT Top 20 Path, Size FROM 'C:\*.*, D:\*.*' ORDER BY Size DESC"
objLogParser.ExecuteBatch strQuery, objInputFormat, objOutputFormat

今天我們將不會深入解說這個指令碼。如果您想進一步瞭解,請參閱《指令碼的物語》(英文) 專欄。您會注意到,指令碼一開始先建立 MSUtil.LogQuery 物件執行個體,然後使用這行程式碼來指明我們想要使用檔案系統中的物件:

Set objInputFormat = CreateObject("MSUtil.LogQuery.FileSystemInputFormat")

接著將 Recurse 屬性的值設為 -1,告訴了 Log Parser 我們想要以遞迴方式搜尋特定路徑中的所有資料夾。(沒錯,路徑尚未指定,我們等一下馬上就指定)。

這些程式碼的前面幾行設定了輸入參數。接著我們使用這兩行程式碼來設定輸出參數:

Set objOutputFormat = CreateObject("MSUtil.LogQuery.NativeOutputFormat")
objOutputFormat.rtp = -1

我們將不會在此深入詳盡說明。第一行告訴 Log Parser 將資料輸出至命令視窗,設定 rtp 屬性為 -1 來告知 Log Parser 一次編寫所有的資料,不要在每個螢幕之後暫停等候使用者按下任何按鍵來繼續。使用 Log Parser 時,您可以自由地將資料輸出至命令視窗,目前這樣似乎是最簡單直接的方法。

處理好輸入及輸出參數之後,我們接下來要建立 Log Parser 查詢:

strQuery = "SELECT Top 20 Path, Size FROM 'C:\*.*, D:\*.*' ORDER BY Size DESC"

如果您已經有一些編寫 SQL 查詢的經驗,這一行的程式碼應該不難懂。我們在此所做的就是要求前 20 大的檔案。我們要求了「前 20 大」檔案,然後以大小遞減的順序排序。當我們做出此要求時,Log Parser 將會抓取所有的檔案,然後將它們以遞減順序排序。因為我們只要前 20 大檔案,所以螢幕上只會秀出前 20 大檔案。要是我們想要前 50 大檔案呢?那我們就要求要前 50 大檔案:

strQuery = "SELECT Top 50 Path, Size FROM 'C:\*.*, D:\*.*' ORDER BY Size DESC"

要是我們想要前 20 檔案呢?那樣的話,我們就可以遞增順序排序檔案,這樣最小的檔案就會列在清單的最上方:

strQuery = "SELECT Top 20 Path, Size FROM 'C:\*.*, D:\*.*' ORDER BY Size ASC"

看到了嗎?跟您說過很簡單的。

如您所見,我們只有要求檔案路徑及檔案大小。當然我們也可以取得檔案的其他資訊。(請參閱 Log Parser 文件,以取得其他詳細資訊)。請注意我們需要指明想要搜尋的每個磁碟,以逗號區隔每個磁碟:

strQuery = "SELECT Top 20 Path, Size FROM 'C:\*.*, D:\*.*' ORDER BY Size DESC"

此外,*.* 是一種標準檔案系統萬用字元,表示「所有的檔案,不管是檔案名稱或是副檔名」。如果我們只對前 20 大 Microsoft Word 文件有興趣,可以將查詢修該如下:

strQuery = "SELECT Top 20 Path, Size FROM 'C:\*.doc, D:\*.doc' ORDER BY Size DESC"

將指令碼儲存為 .vbs 檔案使用,您會發現被取回電腦前 20 大檔案的資訊真是快的嚇人。

但應該不會比發現傳統英式早餐竟然以烤豆子和烤番茄為主食時還驚訝,算了,畢竟都是食物,能吃就好。

當然啦,如果裡面有蝸牛,就又另當別論。


如需詳細資訊

請參閱嗨,Scripting Guy! - 過往文件

 

回到頁首 回到頁首