[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理字符串替换时百分号与冒号的暧昧

看代码:
1.
  1. set a=strange
  2. echo %a:=%
  3. pause
复制代码
如上代码,一闪就过,思路是如果要替换的字符和用来替换的字符都为空会是什么样的结果,本人无法解释,麻烦论坛的朋友开导一下。
2.
  1. echo %a:xy=%
  2. ::显示xy=,此处不明白百分号和a到底起了什么作用,为什么会显示xy=,命令行如何解释的?
  3. pause
复制代码
3.
  1. echo %a:xy=
  2. ::显示结果同代码2.同样不明白,对比代码4再看看
  3. pause
复制代码
4.
  1. echo a:xy=%
  2. ::显示a:xy=,百分号%在这里被丢弃了,而代码3却因为有%和a是整个命令的含义不一样了,why?
  3. pause
复制代码
5.
  1. echo %a:
  2. ::显示结果为echo处于关闭状态。百分号%此处似乎跟结果有很大干系,感觉像被当成了变量的一部分,why?
  3. pause
复制代码
6.
  1. echo %a,
  2. ::显示结果为a,,与代码5完全不一样,而代码差别一个是冒号一个是逗号,位置都相同,做何解?
  3. pause
复制代码
7.
  1. echo a:%
  2. ::这个好理解,末尾的百分号丢弃,直接显示a:,主要为了做参照
复制代码
如上,每个代码有相应注释,也是小弟的疑问。平时虽然大家不会这样去定义某个变量,但是本人觉得只从根本上弄清了事情的来龙去脉才能更少犯错。编程中的bug不是有很多时候都是机缘巧合在处理过程中没有考虑到某些特定字符的组合从而造成解释器将这些组合误解而产生的么?严谨是编程必备的素质。帖子很久了,今天重新全面修改当是顶一下了,有点繁琐,希望达人们从原理上指导一二,不胜感激!

[ 本帖最后由 Lumiere 于 2009-8-10 23:29 编辑 ]
Still with wax

学学怎么调试代码吧:
不要双击运行
把代码保存为C:\test.bat
开始
运行
cmd
C:\test.bat
看看执行过程再好好想想
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 2楼 的帖子

多谢论坛巡查兄的建议,上次也是你告诉我学会自己调试,所以现在如果代码有问题我会先把echo off删除再运行,已经能够解决很多粗心引起的问题,学到不少,非常感谢,这次又承蒙你指教学会在CMD窗口调试。不过很抱歉,本人资质鲁钝,虽然学会了一种调试方法,可针对本贴问题还是无法解释,我照你的说法把第一个代码复制了到test.bat运行以后,提示“此时不应有=%。我还是不怎么明白。先说说我的意图,本身我是在做一个变量中的字符替换时候突发奇想,思考如果变量要指定的特定字符还有要用来替换的字符都为空的话,会如何显示,所以才有了上面一段代码,还是不明白为什么会一闪而过,麻烦老兄赐教。还有第二个调试以后还是一样,没有多余可参考的提示,就是显示xy=,还请兄不吝赐教,麻烦之处见谅。

[ 本帖最后由 Lumiere 于 2009-4-2 12:22 编辑 ]
Still with wax

TOP

对于楼主代码,其实不需要写bat ,直接在命令行下一行行打就行了。
第一个代码没有意义,无论什么情况都不需要空替换成空。
%a:x=y% 就是将%a%的值含x部分 替换为y . x 不能为空。

第二个代码返回strange 很正常,楼主再测一下,其他代码不符合变量扩展语法,不用钻牛角尖,呵

TOP

回复 4楼 的帖子

多谢楼上跟帖,不过仁兄似乎没有明白我的意思。有时候写bat和直接在CMD窗口运行效果不一样的。先不说要替换和用来替换的部分是不是为空,仁兄最后一句似乎就看错了。代码二返回的是xy=,而不是strange,还有一点要强调的是,不要将代码一定义a的句子也无疑的当做代码二的一部分,代码二根本就没有定义变量a,整个代码就是那么多,a未定义,但是显示%a:xy=%的时候,得到的结果确实xy=,不知道%a:%这个部分干嘛了。应该不是被当中变量了,要不应该提示echo状态为关闭才对,那到底为什么那么显示呢?
Still with wax

TOP

自己顶,这么长时间了没人开导一下,难道这又涉及到批处理预处理机制么?是不是不好说明白啊?
Still with wax

TOP

第一个代码应该是语法错误,set命令没有这样的用法(被替换字符本身不能为空),导致整个bat直接退出,不再执行后面的命令。类似于if、for等出现语法错误的情况。

后面的问题参见此帖:
预处理时对百分号%的一种处理机制
http://bbs.verybat.org/thread-10907-1-1.html
1

评分人数

命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

建议楼主所有人命令都在cmd中运行吧,你会得到合理的结果的。。。
***共同提高***

TOP

回复 7楼 的帖子

没想到版主在就在非常批处理讨论过百分号冒号之间的关系啊。其实我也是那么想的,只是想求证一个合理的解释,将问题本质上升到理论高度上来。我觉得这个问题还是记住规律就好,不用去刨根问底。
Still with wax

TOP

回复 8楼 的帖子

不好意思啊,恕在下眼拙,在CMD下运行根本看不出什么东西啊……
Still with wax

TOP

返回列表