从一些网站下载的文件,文件名带有广告,典型的就是网站的名称和域名,搞得文件名很长。在一些场景下,广告看得见,真正的文件名却被...了。在以前,我是遇到就手工去掉广告,但一是麻烦,二是效率低。反正经常下载的就那么几个网站,需要一款小工具来自动化处理。

常用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

世界又完美了。

DOS批处理中对含有特殊字符的文件名的处理方法的更多相关文章

  1. DOS批处理中%~dp0表示什么意思

    https://www.jianshu.com/p/5a1a882ead95 https://www.cnblogs.com/cnpirate/p/5282324.html https://www.c ...

  2. DOS批处理中%~dp0等扩充变量语法详解

    有时候我们看到别人使用%~dp0 ~是扩展的意思,相当于把一个相对路径转换绝对路径%0代指批处理文件自身%1表示批处理文件命令行接收到的第一个参数,%2表示第二个,以此类推%~d0 是指批处理所在的盘 ...

  3. DOS批处理中%cd%和%~dp0的区别

    DOS批处理中%cd%和%~dp0的区别   在DOS的批处理中,有时候需要知道当前的路径. 在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0.       这两个变量 ...

  4. DOS批处理中%cd%和%~dp0的区别[forward]

    DOS批处理中%cd%和%~dp0的区别   在DOS的批处理中,有时候需要知道当前的路径. 在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0.      这两个变量的 ...

  5. 解决DOS批处理中一个困扰我几十个月的编码问题

    DOS批处理中的编码很有意思.&是命令连接符,先执行&左边的命令,再执行&右边的命令.|是管道操作,把左边的输出当作右边的输入.此外还有&&和||,当要表示这些 ...

  6. DOS批处理中%cd%与%~dp0的区别详解

    转载:https://www.jb51.net/article/105325.htm DOS批处理中%cd%与%~dp0的区别详解     Windows下批处理中%cd%和%~dp0都能用来表示当前 ...

  7. 转载:dos批处理中路径获取

    在DOS的批处理中,有时候需要知道当前的路径. 在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0.      这两个变量的用法和代表的内容是不同的.  1. %cd% ...

  8. DOS批处理中%cd%和%~dp0的异同分析

    在DOS的批处理中,有时候需要知道当前的路径.在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0. 这两个变量的用法和代表的内容是不同的. 1. %cd% 可以用在批处理 ...

  9. oracle数据库出现“批处理中出现错误: ORA-00001: 违反唯一约束条件”解决方法

    最近使用oraclede impdp工具全库导入数据库时,在数据库里面使用出现如下情况. SQL state : 违反唯一约束条件 (GDXAORCL.SYS_C0055359) ; nested e ...

随机推荐

  1. unicorn与nginx通讯--[ruby unix socket]

    [龍昌博客] http://www.xefan.com/archives/84146.html unicorn是如何与nginx通讯的——介绍ruby中的unix socket Ruby 应用服务典型 ...

  2. elasticsearch 6.2.4添加用户密码认证

    elasticsearch 6.3版本之前的添加认证需安装x-pack插件,6.3之后貌似去掉了这个. 1.安装x-pack 先切换到elastic用户下,在执行以下命令 $cd /data/elas ...

  3. 【迅为电子】迷你工控机_24小时运行_无线WIFI_超多接口

    全封闭防尘_迅为嵌入式工控主机_运行Linux-QT4.7操作系统 技术规格参数: 设备型号:eTOP-A7-MANNV10 CPU:Cortex-A7 内存:512MDDR 存储:8G EMMC 电 ...

  4. 【4】学习C++之内存管理

    单个内存申请及释放: int *p = new int; if(p == NULL) { //内存分配失败 //异常处理 } delete p; p = NULL; 内存块的申请及释放: ]; if( ...

  5. 2、for 循环

    exit_flag = False for i in range(10): if i <5: continue ##继续循环下一次,后面不执行 print(i) for j in range(1 ...

  6. Linux下定时备份文件

    一. 编写脚本 编写一个脚本文件,使脚本可以执行备份命令. 例如,将文件目录 /home/backups/balalala 备份到/home目录下,并压缩. 1. 创建脚本 命令格式: touch 路 ...

  7. 前端笔记知识点整合之JavaScript(三)关于条件判断语句、循环语句那点事

      一.条件分支语句 条件分支语句,也叫作条件判断语句,就是根据某种条件执行某些语句,不执行某些语句. JS中有三种语法是可以表示条件分支的 1.1 if……else…… 条件分支的主力语法,这个主力 ...

  8. MySQL之CONCAT()的用法

    mysql CONCAT()函数用于将多个字符串连接成一个字符串,是最重要的mysql函数之一,下面就将为您详细介绍mysql CONCAT()函数,供您参考 mysql CONCAT(str1,st ...

  9. C# this关键字的四种用法

    Go to below URL to find more details and example. http://blog.csdn.net/longlong821/article/details/7 ...

  10. docker简单介绍----存储

    docker容器 中使用Volumes来实现数据的持久性,因为容器的删除会丢失数据,而关闭或者重启容器不会丢失数据 docker run -v即可使用Volumes 1.docker-managed ...