cmd批处理转义字符%的详细解释
cmd批处理转义字符%的详细解释
在命令行中使用for时不需要双%,这源于命令解释器对命令行与批处理的处理方式不同。
1、%是个ESCAPE字符,通常将之译为转义字符,但也有更形象的译名脱逸字符、逃逸字符等。也就是说%不仅仅将与其相关的特定字符串转义并替换为特定字符串,而且自身也会被“脱逸”。而且类似于C语言中的转义字符"\",双%会转义并脱逸为单%,四%则脱为双%。
2、for本身是一个特殊的命令,类似于一个特化的命令解释器,因为它的功能实现需要执行多条语句,因此它必须也具有对命令行(特指do后的命令行)分析处理的功能。而command/cmd实现for时自然会借用自身原有的命令行分析模块,因此for具有二级转义的特性,for中do后的语句被分两级分析和解释,第一级在command/cmd读入并解释for命令行时,第二级在for读入并解释do命令时,它通常会对同一命令行的进行多次解释。
然后,我们可以注意到,在do中使用命令行参数变量和环境变量时,不需要双%,那是因为,这些变量在经过第一级转义后,被替换成特定的不变的字符串常量,参与for循环的所有执行过程;而替代变量则要求在执行(do后的子命令行中)过程中不断的动态变化,而这个变化自然仍需要通过脱逸字符来实现,因此使用双%就是成了必然的选择。
另外,还需要注意到,在命令行中使用for时不需要双%,这源于命令解释器对命令行与批处理的处理方式不同。在早期的DOS版本中,%在命令行中不被视为转义字符,所以不会被转义和脱逸,所以当时无法在命令行直接引用环境变量。而使用for时,只需要一个%供for进行转义和脱逸就够了。在以后的命令解释器版本中,加入了命令行转义的支持(主要是环境变量的支持),但命令行for使用单%的传统仍然保留了下来。
而 cmd中的变量延迟替换是属于特殊的情况,但不违背以上的转义原则,只是for中的环境变量不再是常量了。
案例:
我在自己的一个bat文件,内容:
@echo off
if "%1" == "" (goto input_data) ELSE (goto input_var)
:input_data
set /p var=INPUT DATE(fmt:yyyyMMddHHmm):
goto start
:input_var
set /a var=%1
goto start
:start
cd %cd%
md ..\..\to-save\TKcard\%var%
mysql -P3302 -uroot -pdst72j$mq)c%%8 -h61.160.245.119 -N -s -e"SET SESSION group_concat_max_len = 99999999;SELECT CONCAT('mysqldump -h61.160.245.119 -P3302 -uroot
-pdst72j$mq)c%%%%8 --opt -n TKCard_cn_cn_db210060000 ',GROUP_CONCAT(t.TABLE_NAME SEPARATOR ' '),' >') FROM information_schema.TABLES t WHERE t.TABLE_SCHEMA =
'TKCard_cn_cn_db210060000' AND (t.TABLE_NAME LIKE 'dict_%%') AND t.TABLE_NAME NOT IN('dict_keyvalue','dict_server','dict_operator_config');" > tkcard_dict.bat
for /f "delims=] tokens=1" %%a in (tkcard_dict.bat) do echo %%a ..\..\to-save\TKcard\%var%\tkcard_dict.sql >tkcard_dict.bat
call tkcard_dict.bat
上边功能是将远程指定数据库中的所有基础数据导出来。文件中写了一个mysql 连接数据库的脚本,并且在这个脚本里 通过“-e” 参数执行 导出所有基础表数据的脚本代码(即mysqldump 命令),结果没有达到自己的预期效果,分析原因,操作内网数据库就可以,把ip地址改为远程数据库地址就不行了,分析来分析去最后原来是这个 数据库连接密码问题,即密码内网密码没有 特殊字符 % ,而远程的这个有%,结果就是这个% 没有特殊转义出的问题,上边的脚步里涉及2处相同的密码,一处是 连接数据库时要密码,还一个是 对数据库中导出所有基础数据时用的 mysqldump命令时也要再要一次相同的密码,这个bat文件一共2处密码,而且都是一样的,密码里又涉及%,结果我就是没有对这2处% 进行特殊转义出问题了。上边的是已经正确转义了,原来密码为: dst72j$mq)c%8 , 第一处正确转义是在%前再加一个%,第二处是需要%前加3个%。 由于文章开头%转义规则,2个%转义一次为%,4个%转义后为2个%,那这里第一处要想正确连接数据库就保证密码为原始密码即有自身的一个%,那就必须加一个%,那这样第一处密码里就有2个%,当windows 的命令行 解释器执行连接数据库时会转义这2个% 为一个%,刚好和原始密码一样,而上边第二处密码要想也保证和原始密码一样那也要多加%,至于加几个,我们先来看看上边第二处涉及的逻辑先理一下。上边一个是连接数据库,并且后缀mysql 的参数命令-e 即 执行后边的sql脚本,即先连接数据库然后执行后边脚本,结构为 mysql -P[大写p为端口] -u[连接数据库的账号] -p[小写p为连接数据库的密码] -h[数据库ip地址] -N[不显示列信息] -s[一行一行输出,中间有tab分隔] -e[执行mysql的sql语句,后跟双引号,双引号里为sql脚本代码]"[双引号里为前边-e后跟的sql脚本-此省略下边解释]" >tkcard_dict.bat[上边sql执行的结果定向到tkcard_dict.bat文件中,由于tkcard_dict.bat前没有路径,那就是当前目录,如果没有tkcard_dict.bat文件就创建,有就覆盖] for...[for循环开始执行tkcard_dict.bat文件]。
这里特别把上边-e后的双引号中的脚本拿出来解释: SET SESSION group_concat_max_len = 99999999;SELECT CONCAT('mysqldump -h61.160.245.119 -P3302 -uroot
-pdst72j$mq)c%%%%8 --opt -n TKCard_cn_cn_db210060000 ',GROUP_CONCAT(t.TABLE_NAME SEPARATOR ' '),' >') FROM information_schema.TABLES t WHERE t.TABLE_SCHEMA =
'TKCard_cn_cn_db210060000' AND (t.TABLE_NAME LIKE 'dict_%%') AND t.TABLE_NAME NOT IN('dict_keyvalue','dict_server','dict_operator_config');"
意思是先设置grop_concat函数本次查询session的长度,然后 select concat(mysqldump代码-是把代码拼成字符串常量此不会执行 , group_concat(把从information_schema.TABLES 表中按照where条件全查出来的dict基础表名字查出来用一个空格间隔并且拼成一个字符串)-整个group_concat 的结果作为前边concat函数的一个参数 , ' >' )
可以看出-e后双引号中的脚步 中那个 select 脚步功能主要就是 从 information_schema.TABLES(这个数据库中的TABLES表中存放是这台mysql服务器中除了information_schema外的所有其他数据库名字,以及所有数据库中所有表名字,具体点即TABLES表中TABLE_SCHEMA字段存放是数据库名字,TABLES表中TABLE_NAME字段存放是每个数据库中表的名字) 表中按照where条件中给定的数据库名字和数据表名字2个条件查询出基础数据表的表名字,然后把查出的基础数据表名字通过GROUP_CONCAT 函数用一个空格间隔并且拼成一个字符串,然后再和 mysqldump命令的字符串 以及 一个'[有一个空格] >' 共三个参数 通过concat 函数 拼成一个最终的字符串 ,然互通过“ > tkcard_dict.bat ” 重定向到 tkcard_dict.bat文件中,即 tkcard_dict.bat文件中内容最终 是 : mysqldump -h61.160.245.119 -P3302 -uroot
-pdst72j$mq)c%%%%8 --opt -n TKCard_cn_cn_db210060000 基础表1 基础表2 基础表3 ... >
至于for 后边的代码就是不太清楚了,估计就是执行上边 新生成的 tkcard_dict.bat 文件中的内容吧,而其内容刚好就是 一个mysqldump脚本,所以就把这个mysqldump脚本执行后的结果都导入到 自定路径下的tkcard_dict.sql 文件中把。至于最后的最上边bat代码中的最后的那个 “>tkcard_dict.bat” 就不知道干什么用的了。
cmd批处理转义字符%的详细解释的更多相关文章
- windows CMD命令大全及详细解释和语法
http://blog.csdn.net/god_7z1/article/details/51173067
- cmd 环境变量设置方法详细解释
cmd设置环境变量可以方便我们bat脚本的运行,但是要注意的是变量只在当前的cmd窗口有作用(局部生效),如果想要设置持久的环境变量需要我们通过两种手段进行设置:一种是直接修改注册表,另一种是通过我的 ...
- cmd批处理常用符号详解
cmd批处理常用符号详解 作者: 字体:[增加 减小] 类型:转载 我们在批处理编写过程中经常遇到各种特殊符号,很多朋友不是很清楚cmd中特殊符号的含义,这里简单的介绍下,方便需要的朋友 1.@一 ...
- [转帖]cmd批处理常用符号详解
cmd批处理常用符号详解 https://www.jb51.net/article/32866.htm 很多符号 还是不清楚的.. 批处理能够极大的提高 工作效率 需要加强深入学习. 1.@一般在 ...
- CMD批处理——forfiles命令使用,自动删除过期备份文件
公司服务器用来备份数据的硬盘过段时间就会被备份文件占满,弄得我老是要登录到服务器去手工删除那些老的文件,有时忘记了就会导致硬盘空间不足而无法备份.因为只要保留最近几天的备份,如果可以做一个批处理让系统 ...
- .htaccess语法之RewriteCond与RewriteRule指令格式详细解释
htaccess语法之RewriteCond与RewriteRule指令格式详细解释 (2012-11-09 18:09:08) 转载▼ 标签: htaccess it 分类: 网络 上文htacc ...
- cookie的详细解释
突然看到网页上中英文切换的效果,不明白怎么弄得查了查 查到了cookie 并且附有详细解释 就copy留作 以后温习 http://blog.csdn.net/xidor/article/detail ...
- tar命令的详细解释
tar命令的详细解释 标签: linuxfileoutputbashinputshell 2010-05-04 12:11 235881人阅读 评论(12) 收藏 举报 分类: linux/unix ...
- Linux学习笔记15——GDB 命令详细解释【转】
GDB 命令详细解释 Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具. 和所有常用的调试工 ...
随机推荐
- Map-->HashMap练习(新手)
//导入的包.import java.util.*;//创建的一个类.public class zylx1 { //公共静态的主方法. public static void main(String[] ...
- nested exception is java.lang.StackOverflowError解析
背景介绍: 项目是微服务的,使用docker容器,使用jenkins部署.测试环境有个公共服务一直以来都能正常发布,突然有一天不行了,经常发布失败,然后多发布几次就好了. 报错如下: 是栈溢出了,一般 ...
- Journal of Proteomics Research | Th-MYCN转基因小鼠的定量蛋白质学分析揭示了Aurora Kinase抑制剂改变代谢途径和增强ACADM以抑制神经母细胞瘤的进展
题目:Quantitative Proteomics of Th-MYCN Transgenic Mice Reveals Aurora Kinase Inhibitor Altered Metabo ...
- 【docker Elasticsearch】Rest风格的分布式开源搜索和分析引擎Elasticsearch初体验
概述: Elasticsearch 是一个分布式.可扩展.实时的搜索与数据分析引擎. 它能从项目一开始就赋予你的数据以搜索.分析和探索的能力,这是通常没有预料到的. 它存在还因为原始数据如果只是躺在磁 ...
- 使用Eclipse开发python
第一步:下载python插件http://sourceforge.net/projects/pydev/files/pydev/PyDev%204.1.0/第二步:在Eclipse上安装插件a.假设E ...
- hdu1078 dfs+dp(记忆化搜索)搜索一条递增路径,路径和最大,起点是(0,0)
#include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ...
- c#委托、泛型委托和匿名方法
题外话:别指望看第一遍书就能记住和掌握什么——请看第二遍.第三遍. 本人女猿一枚,2年工作经验,喜欢钻研,喜欢创新,闲暇之余喜欢写写博客,深知自身能力薄弱,如表达错误.不当之处请园友们多多指出,互相交 ...
- JDK的sql设计不合理导致的驱动类初始化死锁问题
问题描述 当我们一个系统既需要mysql驱动,也需要oracle驱动的时候,在并发加载初始化这些驱动类的过程中产生死锁的可能性非常大,下面是一个模拟的例子,对于Thread2的实现其实是jdk里jav ...
- mysql之日志
我是李福春,我在准备面试,今天的题目是: mysql的redolog和binlog有什么区别? 答: 如下面的表格, redolog vs binlog 然后我们扩展一下,因为日志主要是记录的修改日志 ...
- 044.集群存储-StorageClass
一 StoragClass 1.1 StorageClass概述 StorageClass作为对存储资源的抽象定义,对用户设置的PVC申请屏蔽后端存储的细节,一方面减少了用户对于存储资源细节的关注,另 ...