zoukankan      html  css  js  c++  java
  • DOS批处理中对含有特殊字符的文件名的处理方法

    从一些网站下载的文件,文件名带有广告,典型的就是网站的名称和域名,搞得文件名很长。在一些场景下,广告看得见,真正的文件名却被...了。在以前,我是遇到就手工去掉广告,但一是麻烦,二是效率低。反正经常下载的就那么几个网站,需要一款小工具来自动化处理。
    常用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的编码问题,但上文解决的特殊字符是自己加进去的,加多少是心中有数的,而现在我遇到的特殊字符是文件名,有没有特殊字符,有多少个是不确定的。心里凉了半截。
    我还有另一个大法宝,就是做实验,实践出真知。
    实验过程比较枯燥,就不细说了。大概是造一些文件名,然后修改代码,并打印许多中间变量值,不断试错。最终得到一些确定的,有用的结论。
    实验结论:

    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
    

    世界又完美了。

  • 相关阅读:
    Tjoi 2017 异或和
    Noi 十连测 建造记者站
    Noi 十连测 基因改造计划
    Noi 十连测 人生的经验
    NOI 十连测 Round 5 T2 运河计划
    NOI 十连测 Round 5 T1
    【ZJOI2018】迷宫
    BZOJ 十连测 day5 T3
    BZOJ 十连测 可持久化字符串
    BZOJ 十连测 二进制的世界
  • 原文地址:https://www.cnblogs.com/BillySir/p/10191442.html
Copyright © 2011-2022 走看看