從一些網站下載的文件,文件名帶有廣告,典型的就是網站的名稱和域名,搞得文件名很長。在一些場景下,廣告看得見,真正的文件名卻被...了。在以前,我是遇到就手工去掉廣告,但一是麻煩,二是效率低。反正經常下載的就那么幾個網站,需要一款小工具來自動化處理。
常用Windows,所以批處理是首選,而且改名這種是批處理的強項。
改名的命令: REN 舊名 新名
我們需要由舊名算出新名。其實就是字符串替換。
替換的命令:SET 變量名2=%變量名1:舊串=新串%
就是把變量名1中的全部的舊串替換成新串然后賦值給變量名2,兩個也可以是同一個變量。=右邊直接跟%就起到了移除的作用。
三下五除二,寫出了腳本:
@Echo Off
for %%f in (*.*) do call :rn %%f
goto :eof
:rn
set fn=%1
set fn=%fn:[網站名稱www.domain.com]=%
set fn=%fn:.網站名稱.www.domain.com=%
ren %1 %fn%
goto :eof
它工作得很好,直到有一天遇到了問題,報錯信息:
系統找不到指定的文件。
原因是遇到了一個文件名帶有&的文件,進一步發現,文件名帶有空格,或者^,都會出問題。
這個,不怕,我有法寶。重溫了一遍 解決DOS批處理中一個困擾我幾十個月的編碼問題 ,發現兩者有區別。雖然都是DOS Shell的編碼問題,但上文解決的特殊字符是自己加進去的,加多少是心中有數的,而現在我遇到的特殊字符是文件名,有沒有特殊字符,有多少個是不確定的。心里涼了半截。
我還有另一個大法寶,就是做實驗,實踐出真知。
實驗過程比較枯燥,就不細說了。大概是造一些文件名,然后修改代碼,並打印許多中間變量值,不斷試錯。最終得到一些確定的,有用的結論。
實驗結論:
- 對一個文件路徑來說,最好的方式是確保它包在一層雙引號內。此時它只有一個特殊,就是一個會被自動變成2個。
&|(空格)等字符會因為被包的雙引號中而變成普通字符。Windows禁止|當作文件(夾)名。- 在對它(包在單層雙引號中的文件路徑)中的
^或&進行處理時,都當作普通字符就好。 - 通過把
^^替換回^,就得到正確的文件名。 - 腳本在處理的整個過程中,文件路徑都要保持有雙引號,就不會出問題。
- 替換命令本身中的
舊串和新串中若有^&|等字符不必轉義,且不必把set的右邊整個包起來。如 set "p=abc.txt"
最終的腳本:
@Echo Off
for %%f in (*.*) do call :rn "%%f"
goto :eof
:rn
set fn=%1
set fn0=%fn:^^=^%
set fn=%fn:^^=^%
set fn=%fn:[網站名稱www.domain.com]=%
set fn=%fn:.網站名稱.www.domain.com=%
ren %fn0% %fn%
goto :eof
世界又完美了。
