嗨,Scripting Guy!

Hey,Scripting Guy!

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

今天的問題:如何分辨資料夾裡有特定附檔名的檔案?


如何分辨資料夾裡有特定附檔名的檔案?

嗨,Scripting Guy!如何確定有特定附檔名的檔案是否存在於資料夾內?

-- GM

GM,您好。這是非常容易的事。我們只要寫一個 WMI 查詢,其中包含我們要檢查的資料夾的路徑,以及我們要搜尋的附檔名。例如,這個指令碼會抓取所有在 C:\Scripts 資料夾中發現的 .txt 檔案的集合:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService. _
    ExecQuery("SELECT * FROM CIM_DataFile WHERE Path = '\\Scripts\\' " & _
        "AND Drive = 'C:' AND Extension = 'txt'")
Wscript.Echo "Number of .txt files found: " & colFiles.Count

如果您仔細觀察這個指令碼 (您們的確很仔細注意這些事,對不對?),可能會發現幾件事。首先,我們不將路徑指定為 C:\Scripts;相反的,我們分開磁碟機 (C:)與資料夾 (Scripts)。為什麼要這樣做呢?因為,不論如何,那正是 CIM_DataFile 類別運作的原理;我們所認為的檔案路徑是分成磁碟與資料夾兩部分的。這裡的磁碟參數事實上是選擇性的,我們可以讓它省略,「除非」我們也有命名為 D:\Scripts 的資料夾。如果是這樣的情形,則磁碟參數會變成強制性的;省略它,則查詢會傳回資料夾中有路徑 Script 的所有檔案。那會包含 D:\Scripts (及 E:\Scripts 與 F:\Scripts 與 …) 如同 C:\Scripts。

第二,您也許注意到我們在 Path 兩邊使用了雙重 \\;因此有了 \\Scripts\\ 而不是 \Scripts\ (也就是,C:\Scripts)。為什麼?再重申一次,那正是 WMI 運作的原理;當您每次在 WHERE 子句中包含檔案路徑時,您必須使用兩個 \\。那麼如果我們要檢查資料夾 C:\Documents and Settings\Ken Myer\Desktop\Work Files 中,看看其中是否有 .txt 檔的話呢?在這個情況下,我們的 WHERE 子句看起來會是以下這個樣子:

WHERE Path = '\\Documents and Settings\\Ken Myer\\Desktop\\Work Files\\

注意,Path 結尾有兩個 \\。這些是很重要的;不可省略。(除非您不介意指令碼是否確實在運作。)當我們忙著注意細節時,請注意,我們並未包含指定檔案附檔名的時候;我們用的只是 txt,而不是 .txt

在我們取回集合之後,我們所要做的是呼叫集合的 Count 屬性的值。這可讓我們得知共發現了多少 .txt 檔案。如果 Count 為 0,表示沒有任何發現;如果 Count 為 7,表示發現了 7 個。其他的您自己應該想的到吧。

看吧,我們告訴過您這很容易的。嗨,每一次,我們確確實實知道我們說的是什麼!


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首