Share via


嗨,Scripting Guy!

嗨,Scripting Guy!

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

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

今天的問題:要如何將類似 _JKG1234.jpg 的檔名重新命名為 272_DSC_1234.jpg?


要如何將類似 _JKG1234.jpg 的檔名重新命名為 272_DSC_1234.jpg?

嗨,Scripting Guy!要如何將類似 _JKG1234.jpg 的檔名重新命名為 272_DSC_1234.jpg?

-- NA

NA,您好。NA,我們對您寄予同情。為什麼?一方面來說,您實在太幸運了,Scripting Guy 寫的指令碼通常自己不用,但您竟然問到一個例外,果然是奮發向上的好青年。這麼說來您的運氣也真是背,天時地利人和,正是買樂透的好時機,沒想到您竟然拿好運勢來問 Scripting Guy 這個問題。太可惜啦!

兩年前其中一位 Scripting Guy 到日本看孩子打棒球 (說實在的,Scripting Guy 做的每一件事都含有棒球哲理)。Scripting Guy 在日本拍了不少數位相片,檔名是以 100_1023.jpg 和 100_1024.jpg 的模式自動指派。這位仁兄懶得替相片檔案一一重新命名,為了方便辨識,決定至少把把檔案重新命名,以便區分是日本棒球的照片。也就是說,他想把 100_1023.jpg 的照片改名為 Japan_1023.jpg。信不信由您,這些工作確實是使用指令碼來完成的。

現在還以為所有的 Scripting Guy 都光說不練嗎?

這一位 Scripting Guy 例外 (至少這次例外)。他使用類似下面的指令碼將圖形檔案重新命名:

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery _
    ("ASSOCIATORS OF {Win32_Directory.Name='C:\Photos'} Where " _
        & "ResultClass = CIM_DataFile")
For Each objFile In colFiles
    strEnd = Right(objFile.Name, 8)
    strNewName = objFile.Drive & objFile.Path & "272_DSC_" & strEnd
    errResult = objFile.Rename(strNewName)
Next

這裡有幾點要注意。第一,我們假設您是想要將特定資料夾中的所有檔案都重新命名。如果不是的話,那麼就需要另外加入的行程式碼,以篩選出您不想要更名的檔案。第二,我們假設每個相片都以四位數結尾,副檔名均為 .jpg。如果不符合以上條件 (例如檔名類似 _JKG1.jpg),那麼這個指令碼不符合您的需要,您仍然可以將這些檔案重新命名,但是指令碼會比較複雜。但目前的經驗顯示,我們熟悉的數位相機大都在檔名後面添加四位數的號碼,所以假設您的情況也一樣。

指令碼會先連接到本機電腦上的 WMI 服務,然後使用 Associators Of 查詢,將 C:\TestLog 資料夾中的所有檔案盡數傳回。

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

我們同意您的看法,Associators Of 查詢長得實在奇怪,但您不用擔心,只要把 C:\Photos 取代為特定檔案的路徑,其他都不要動就得了。

我們接著使用這個指令碼區塊,逐一處理所有的圖形檔案:

For Each objFile In colFiles
    strEnd = Right(objFile.Name, 8)
    strNewName = objFile.Drive & objFile.Path & "272_DSC_" & strEnd
    errResult = objFile.Rename(strNewName)
Next

迴圈會先查詢第一個檔案的 Name,例如 C:\Photos\_JKG1234.jpg (WMI 中,檔案的 Name 屬性指的是檔案路徑)。接著使用 VBScript Right 含式,取得 Name 字元最右邊的 8 個字元,也就是 1234.jpg (C:\Photos\_JKG1234.jpg)。這是要保留的 8 個字元 (不想更改檔案編號或副檔名),我們把它暫時放在 strEnd 變數內。

接下來就是使用下列指令碼,替檔案建立新名稱:

strNewName = objFile.Drive & objFile.Path & "272_DSC_" & strEnd

使用 WMI 替檔案重新命名時必須指定完整的路徑,不是隨便給一個檔名就了事 (例如 NewName.jpg 就不行)。因此就必須把下面各項資料串連在一起:磁碟機代號 (C:)、路徑 (就 WMI 而言,就是不包括磁碟機代號的檔案路徑,例如 \Photos\)、新檔名的前綴詞 (272_DSC_),以及從現有檔名保留的 8 個字元。也就是:

C: + \Photos\ + 272_DSC_ + 1234.jpg

把它們都放在一起就是 C:\Photos\272_DSC_1234.jpg,代表新檔案路徑,這樣就得了。

接著呼叫 Rename 方法,把新的檔案路徑當作單一個方法參數傳送。然後以迴圈逐一對集合裡剩下的檔案重複執行這個程序。

說真的,我們真的很同意您的看法:獲得這種知識比贏彩券更有價值,只要不停的告訴自己... 更有價值。


如需詳細資訊

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

 

回到頁首 回到頁首