Share via


嗨,Scripting Guy!

Hey,Scripting Guy!

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

今天的問題:我是否能使用指令碼重新命名資料夾中的所有檔案?


我是否能使用指令碼重新命名資料夾中的所有檔案?

嗨,Scripting Guy!我是否能使用指令碼重新命名目錄中的所有檔案,同時在原來的檔案名稱之前加上「pl-」前置詞?

-- JP

JP,您好。挺有趣的,許多人需要做一些類似的事情:他們需要重新命名指定資料夾中所有的檔案,其方式不是附加日期、變更副檔名,就是 (正如這個案例) 在每個檔案名稱開頭補上「pl-」。不要讓大家說 Script Guys 不傾聽 Microsoft 客戶的心聲 (我們是不聽啊,可是就是不想聽到大家這麼說!)以下這段指令碼會進行您想要做的事:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colFileList = objWMIService.ExecQuery _
    ("ASSOCIATORS OF {Win32_Directory.Name='C:\Logs'} Where " _
        & "ResultClass = CIM_DataFile")

For Each objFile In colFileList
    strNewName = objFile.Drive & objFile.Path & "pl-" & _
        objFile.FileName & "." & objFile.Extension
    errResult = objFile.Rename(strNewName)
Next

如果您打算修改這段指令碼以符合需求,有兩個重點要牢記在心。首先,注意我們使用了 Associators Of 查詢,為的是要傳回資料夾中找到所有檔案的集合 (在這個案例中,資料夾是 C:\Logs):

Set colFileList = objWMIService.ExecQuery _
    ("ASSOCIATORS OF {Win32_Directory.Name='C:\Logs'} Where " _
        & "ResultClass = CIM_DataFile")

Associators Of 查詢所執行的工作大致如同名稱所意味的:它讓您能夠與兩個 WMI 類別建立關聯。在這個案例中,我們將 Win32_Directory (管理資料夾的類別) 與 CIM_DataFile (管理檔案的類別) 建立關聯。您可能會認為 Win32_Directory 類別會有名為 Files 的屬性,它可以列出資料夾中找到的所有檔案。然而基於某些原因,情況不是這樣。相反的,必須使用 Associators Of 查詢來達到相同效果。

如您所預期,在這小小的專欄中無法詳盡討論 Associators Of。如需詳細資訊,請參閱 WMI SDK (英文) 中有關這部份的內容。目前只要照樣複製程式碼,並在必要時變更 C:\Logs 為適當的資料夾即可。

另一件要牢記的事就是,當您使用 WMI 重新命名檔案時,必須傳遞整個檔案路徑給 Rename 方法。假設要將檔案 C:\Logs\File_1.txt 重新命名為 C:\Logs\Pl-File_1.txt。下面這行程式碼並無作用:

errResult = objFile.Rename("Pl-File_1.txt")

您必須改用這行程式碼:

errResult = objFile.Rename("C:\Logs\Pl-File_1.txt")

這也就是為什麼 Rename 方法之前的程式碼看起來如此複雜:我們必須為新的檔案名稱建構完整路徑,再將路徑指派給變數 strNewName,然後傳遞 strNewName 至 Rename 方法。以下是對程式碼的分解說明:

objFile.Drive 傳回準備重新命名檔案的磁碟機代號 (在這個案例就是 C:)。
objFile.Path 別讓名稱騙了您:Path 屬性只能傳回資料夾路徑,並不包含磁碟機和檔案名稱。例如,如果是連接到檔案 C:\Logs\File1_txt,Path 屬性會傳回 Logs\。如果連接到 C:\Scripts\Logs\Admin Logs\File_1.txt,Path 則會是 Scripts\Logs\Admin Logs\。
"pl-" 我們要加在每個檔案名稱之前的前置詞。
objFile.FileName 檔案目前的名稱,但「不含」副檔名 (在這個案例中就是 File_1)。
"." 介於檔案名稱和副檔名之間的句號。Extension 屬性 (詳見下面說明) 只傳回副檔名所包含的「字元」 (例如,txt),而不會傳回句號。
objFile.Extension 檔案的副檔名。假設要將這些所有的檔案從 .txt 變更為 .log。那麼就不需要使用現有的副檔名,而是應該將 .log 附加至檔案名稱的結尾。

換句話說:

objFile.Drive C:|
objFile.PathLogs|"pl-"
pl-
objFile.FileName File_1
"." .
objFile.Extension txt

將它們全部加在一起:C:\ + Logs\ + pl- + File_1 + .+ txt,就會得到新的檔案名稱。


如需詳細資訊

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

 

回到頁首 回到頁首