DOS批處理中對含有特殊字符的文件名的處理方法

從一些網站下載的文件,文件名帶有廣告,典型的就是網站的名稱和域名,搞得文件名很長。在一些場景下,廣告看得見,真正的文件名卻被...了。在之前,我是遇到就手工去掉廣告,但一是麻煩,二是效率低。反正常常下載的就那麼幾個網站,須要一款小工具來自動化處理。
經常使用Windows,因此批處理是首選,並且更名這種是批處理的強項。
更名的命令: REN 舊名 新名
咱們須要由舊名算出新名。其實就是字符串替換。
替換的命令:SET 變量名2=%變量名1:舊串=新串%
就是把變量名1中的所有的舊串替換成新串而後賦值給變量名2,兩個也能夠是同一個變量。=右邊直接跟%就起到了移除的做用。html

三下五除二,寫出了腳本:dom

@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的編碼問題,但上文解決的特殊字符是本身加進去的,加多少是心中有數的,而如今我遇到的特殊字符是文件名,有沒有特殊字符,有多少個是不肯定的。內心涼了半截。
我還有另外一個大法寶,就是作實驗,實踐出真知。
實驗過程比較枯燥,就不細說了。大概是造一些文件名,而後修改代碼,並打印許多中間變量值,不斷試錯。最終獲得一些肯定的,有用的結論。
實驗結論:網站

  1. 對一個文件路徑來講,最好的方式是確保它包在一層雙引號內。此時它只有一個特殊,就是一個^會被自動變成2個^。
  2. &|(空格)等字符會由於被包的雙引號中而變成普通字符。Windows禁止|看成文件(夾)名。
  3. 在對它(包在單層雙引號中的文件路徑)中的^&進行處理時,都看成普通字符就好。
  4. 經過把^^替換回^,就獲得正確的文件名。
  5. 腳本在處理的整個過程當中,文件路徑都要保持有雙引號,就不會出問題。
  6. 替換命令自己中的舊串新串中如有^&|等字符沒必要轉義,且沒必要把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

世界又完美了。code

相關文章
相關標籤/搜索