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
    

    世界又完美了。

  • 相关阅读:
    递归函数及Java范例
    笔记本的硬盘坏了
    “References to generic type List should be parameterized”
    配置管理软件(configuration management software)介绍
    WinCE文件目录定制及内存调整
    使用Silverlight for Embedded开发绚丽的界面(3)
    wince国际化语言支持
    Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
    WinCE Heartbeat Message的实现
    使用Silverlight for Embedded开发绚丽的界面(2)
  • 原文地址:https://www.cnblogs.com/BillySir/p/10191442.html
Copyright © 2011-2022 走看看