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的编码问题,但上文解决的特殊字符是自己加进去的,加多少是心中有数的,而现在我遇到的特殊字符是文件名,有没有特殊字符,有多少个是不确定的。心里凉了半截。
我还有另一个大法宝,就是做实验,实践出真知。
实验过程比较枯燥,就不细说了。大概是造一些文件名,然后修改代码,并打印许多中间变量值,不断试错。最终得到一些确定的,有用的结论。
实验结论:
- 对一个文件路径来说,最好的方式是确保它包在一层双引号内。此时它只有一个特殊,就是一个会被自动变成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
世界又完美了。
DOS批处理中对含有特殊字符的文件名的处理方法的更多相关文章
- DOS批处理中%~dp0表示什么意思
https://www.jianshu.com/p/5a1a882ead95 https://www.cnblogs.com/cnpirate/p/5282324.html https://www.c ...
- DOS批处理中%~dp0等扩充变量语法详解
有时候我们看到别人使用%~dp0 ~是扩展的意思,相当于把一个相对路径转换绝对路径%0代指批处理文件自身%1表示批处理文件命令行接收到的第一个参数,%2表示第二个,以此类推%~d0 是指批处理所在的盘 ...
- DOS批处理中%cd%和%~dp0的区别
DOS批处理中%cd%和%~dp0的区别 在DOS的批处理中,有时候需要知道当前的路径. 在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0. 这两个变量 ...
- DOS批处理中%cd%和%~dp0的区别[forward]
DOS批处理中%cd%和%~dp0的区别 在DOS的批处理中,有时候需要知道当前的路径. 在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0. 这两个变量的 ...
- 解决DOS批处理中一个困扰我几十个月的编码问题
DOS批处理中的编码很有意思.&是命令连接符,先执行&左边的命令,再执行&右边的命令.|是管道操作,把左边的输出当作右边的输入.此外还有&&和||,当要表示这些 ...
- DOS批处理中%cd%与%~dp0的区别详解
转载:https://www.jb51.net/article/105325.htm DOS批处理中%cd%与%~dp0的区别详解 Windows下批处理中%cd%和%~dp0都能用来表示当前 ...
- 转载:dos批处理中路径获取
在DOS的批处理中,有时候需要知道当前的路径. 在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0. 这两个变量的用法和代表的内容是不同的. 1. %cd% ...
- DOS批处理中%cd%和%~dp0的异同分析
在DOS的批处理中,有时候需要知道当前的路径.在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0. 这两个变量的用法和代表的内容是不同的. 1. %cd% 可以用在批处理 ...
- oracle数据库出现“批处理中出现错误: ORA-00001: 违反唯一约束条件”解决方法
最近使用oraclede impdp工具全库导入数据库时,在数据库里面使用出现如下情况. SQL state : 违反唯一约束条件 (GDXAORCL.SYS_C0055359) ; nested e ...
随机推荐
- 技术栈(technology stack)
technology stack 技术栈: 产品实现上依赖的软件基础组件, 包括 1. 系统 2. 中间件 3. 数据库 4. 应用软件 5. 开发语言 6. 框架 https://en.wikipe ...
- Intellij IDEA 修改jsp 不能实时更新
Intellij IDEA 修改jsp 不能实时更新 1. 首先,output要指定到项目的webapp下,这样应该就可以实时更新了 2. 我的问题是这样设置之后,也不可以,原来是可以的,重装系统之后 ...
- python开发基础之语法基础
一.知识点 (一)python介绍 1.Python被设计成一种高可读性的语言,它大量地使用了英语单词作为关键字,不像其他语言使用标点符号构成复杂的语法结构. 2.Pyton是支持面向对象的,支持在对 ...
- Python:正则表达式(二):如何使用re.search()返回的匹配对象中的具体内容呢??
在上一篇中讲述了re.seach()会返回一个对象格式的数据,如下:<_sre.SRE_Match object; span=(16, 24), match='${phone}'> 那么问 ...
- sql报错注入:extractvalue、updatexml报错原理
报错注入:extractvalue.updatexml报错原理 MySQL 5.1.5版本中添加了对XML文档进行查询和修改的两个函数:extractvalue.updatexml 名称 描述 Ext ...
- Haproxy_haproxy.cfg
global # 全局参数的设置 log 127.0.0.1 local2 # log语法:log <address_1>[max_level_1] # 全局的日志配置,使用log关键字, ...
- Linux库多重依赖
源文件: //world.cpp #include <stdio.h> void world(void) { printf("world.\n"); } //hello ...
- XPath Helper使用教程
下载地址 百度网盘下载密码:yuuv下载完成后选择保留 安装 在导航栏中输入chrome://extensions:将.crx文件拖拽到扩展程序页面中,勾选已启用按钮. 使用 重启浏览器,快捷键CTR ...
- CentOS Android Studio桌面图标的创建
1.切换到root用户,在桌面上创建Android.Studio.desktop,如下: [Desktop Entry] Name=Android Studio Comment=Android Stu ...
- java - day005 - 数组工具类, 数组复制,二维数组,变量,方法, 面向对象
1. java.util.Arrays 数组工具类 Arrays.toString (数组) 数组值链接字符串 Arrays.sort(数组) 基本类型: 优化的快速排序 引用类型: 优化的合 ...