Board logo

标题: [文本处理] [已解决]批处理for /f括号中多引号字符串与逗号组合产生的bug [打印本页]

作者: Lumiere    时间: 2009-3-6 13:28     标题: [已解决]批处理for /f括号中多引号字符串与逗号组合产生的bug

for /f %a in ("bbs.bathome.com,","ajf aslf") do echo %a
命令执行后显示(bbs.bathome.com,"),显示内容就是括号里部分,然后另起一行显示系统找不到文件,然后跟一个很奇怪的符号。而下面的命令只是括号里的字符不一样,格式都一样,为什么显示不一样呢?
for /f %a in ("bbs.bathome.com,","bath bathome") do echo %a 显示(bbs.bathome.com,")
还有就是,为什么这两个命令执行以后都会这样显示,第一个为什么不显示第一个引号和最后一个引号里的全部内容呢?我试过把中间的逗号删了的话就可以显示首末引号中间的所有内容。为什么会这样呢,逗号在这里到底起到什么作用导致结果如此?跟FOR /F命令的默认分隔符有关系么?请论坛的朋友帮忙解释下,能详则详,多谢。

[ 本帖最后由 Lumiere 于 2009-8-9 22:56 编辑 ]
作者: Batcher    时间: 2009-3-6 13:51

无法重现你的问题,测试环境:CMD@XP_SP2_EN_VOL

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Test>for /f %a in ("bbs.bathome.com,","ajf aslf") do echo %a

C:\Test>echo bbs.bathome.com,"
bbs.bathome.com,"

C:\Test>for /f %a in ("bbs.bathome.com,","bath bathome") do echo %a

C:\Test>echo bbs.bathome.com,"
bbs.bathome.com,"

C:\Test>

作者: Lumiere    时间: 2009-3-6 14:03     标题: for /f 命令括号中多字符串、多引号、逗号

补充一点就是,第一次输入------for /f %a in ("bbs.bathome.com,","ajf aslf") do echo %a
显示---bbs.bathome.com,"
如图:附件未命名.jpg


第二次输入就变成我开始说的那样了,我很纳闷。
如附件2.jpg
麻烦帮我讲解一下好么?
作者: Lumiere    时间: 2009-3-13 09:14     标题: 迷惑

有没有哪味达人可以为我讲解一下这个与处理机制么?至少推荐些自己看的资料也好啊!
作者: zqz0012005    时间: 2009-3-13 11:38

这个应该是不遵循命令语法而产生的Bug
C:\>for /f %a in ("bbs.bathome.com,","ajf aslf") do echo %a
bbs.bathome.com,"

C:\>for /f %a in ("bbs.bathome.com,","ajf aslf") do echo %a
bbs.bathome.com,"

C:\>for /f %a in ("bbs.bathome.com,","ajf aslf") do echo %a
bbs.bathome.com,"
系统找不到文件 _。

C:\>for /f %a in ("bbs.bathome.com,","ajf aslf") do echo %a
bbs.bathome.com,"
系统找不到文件 §。

C:\>for /f %a in ("bbs.bathome.com,","ajf aslf") do echo %a
bbs.bathome.com,"
系统找不到文件 §。

C:\>for /f %a in ("bbs.bathome.com,","ajf aslf") do echo %a
bbs.bathome.com,"
系统找不到文件 §



上面的“下划线”其实是ASCII字符[SYN](22),“§”其实是[NAK](21)
作者: Lumiere    时间: 2009-3-17 16:11     标题: 能不能帮忙讲解一下这个bug

那么其中的逗号起了什么作用?为什么两次同样的输入结果会不一样?
作者: Lumiere    时间: 2009-3-24 15:13     标题: 旧题重提

拜托群里的达人不吝赐教,我知道这个问题肯定你们都知道,只是讲解起来费力气,如果是在麻烦给个连接也好。我自己找不到这方面材料,毕竟跟批处理的语法有很大出入。不管是不是自己钻牛角尖,没事找事,问题出现了就要解决,什么问题都有个合理的说法的,程序就是这么逻辑的东西,肯定是有原因的。希望达人帮一下忙,多谢!
作者: zqz0012005    时间: 2009-3-24 17:56

这个应该是不遵循命令语法而产生的Bug


没什么原因,就是bug。如果你还要问为什么是这样的bug,你应该考虑去问微软。。。
作者: Lumiere    时间: 2009-3-25 09:14     标题: 回复 8楼 的帖子

哦,那就无法解释了?那么说这个帖子改结了?
作者: qzwqzw    时间: 2010-4-20 21:36

这个问题因为带有一定的随机性
所以基本上可以确认是内存访问越界了
关键在于for/f的括号中出现了多余的双引号
而不管有多少个双引号
for/f都视图将它作为一个字符串来处理
而for/f字符串内部包含有界定字符串特性的双引号
必然会为程序运行带来很多意想不到的风险
D:\Test>for /f %a in ("abcedfghi " "ajf aslf") do echo %a

D:\Test>echo abcedfghi
abcedfghi
系统找不到文件
f       @ҨҨWS\system32\cmd.exe - echo abcedfghi"。

从上面的内存泄露数据可以看出
for /f已经完全被不规则的字符串给乱了方寸




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2