Board logo

标题: [文本处理] [已解决]批处理for命令中tokens^=1*^通过转义后到底表示的什么意思? [打印本页]

作者: stu_p    时间: 2011-9-22 18:01     标题: [已解决]批处理for命令中tokens^=1*^通过转义后到底表示的什么意思?

  1. @echo off
  2. for /f tokens^=1*^ delims^=^" %%a in ("sd"z"vc") do echo %%b
  3. pause
复制代码
下面这两句谁能给讲解一下?这些^=,^"," ,转义后到底表示什么意思
tokens^=1*^
delims^=^"
揣摩了半天2,8,11,13楼的讲解总算明白了,一并感谢各位高手老师。。不知道怎么回事??我怎么无法给
各位加分!!!总是超过24小时什么的~~

作者: Hello123World    时间: 2011-9-22 19:22

for命令默认不能用"作为分隔符,这种方式可以将"作为分隔符。
  1. @echo off
  2. for /f tokens^=1*^ delims^=^" %%a in ("sd"z"vc") do echo %%b
  3. pause
复制代码
第一个^转义等号,第二个转义空格,第三个不解释,第四个转义引号。

这个规律是zm发现的,利用的是预处理的解释机制,具体原理可以请教zm的代言人,ctrl君(可能是这个名字,我只记得zm……)
作者: xudaweb    时间: 2011-9-22 20:58

回复 1# stu_p
这也需要转义?
  1. tokens^=1*^
复制代码
下面这样不是一样的么,干嘛多此一举?
  1. tokens=1*
复制代码

作者: xudaweb    时间: 2011-9-22 21:00

回复 2# Hello123World

向你确认下,你举例的那句代码前两个转义是不是多余的,去掉也可以吧?
作者: Hello123World    时间: 2011-9-22 21:04

回复 4# xudaweb
  1. @echo off
  2. for /f "tokens=1* delims="" %%a in ("sd"z"vc") do echo %%b
  3. pause
复制代码
不转义就这么写,但是这么写是得不到正确结果的;不多余,是必须的。
作者: xudaweb    时间: 2011-9-22 21:20

  1. @echo off
  2. for /f tokens=1* delims^=^" %%a in ("sd"z"vc") do echo %%b
  3. pause
复制代码
我的意思是改成上面这样,但是得不到正确结果。
后面是因为有特殊的"才用转义的,前面1*都不是特殊符号啊,请问为什么前面也要转义呀?
作者: stu_p    时间: 2011-9-22 21:42

后面是因为有特殊的"才用转义的,前面1*都不是特殊符号啊, ...
xudaweb 发表于 2011-9-22 21:20

我的理解是忽略了=和空格,成了tokens1*....没分隔符了,不知道对不对~
作者: cjiabing    时间: 2011-9-22 22:33

  1. @echo off
  2. for /f tokens^=1*^ delims^=^" %%a in ("sd"z"vc") do echo %%b
  3. pause
复制代码
在cmd下,“tokens=* delims= ”这个是连在一起的,用双引号括住。
此处没有使用双引号括住,等于号、顿号等就成为默认的分隔符,需要重新转义。
以上巧妙地使用转义符来解决用双引号作为分隔符,方法很妙。
  1. for /f tokens^=1^,3^ delims^=^". %a in ("sd"z"v.c") do echo %b
复制代码

作者: stu_p    时间: 2011-9-23 10:01

本帖最后由 stu_p 于 2011-9-23 12:52 编辑
在cmd下,“tokens=* delims= ”这个是连在一起的,用双引号括住。
此处没有使用双引号括住,等于号、顿号 ...
cjiabing 发表于 2011-9-22 22:33

按你说的好像解释不通!!例如:
  1. @echo off
  2. for /f tokens^=1-3^ delims^=^" %%a in ("s=d"=z"v=c") do @echo %%a %%b %%c
  3. pause
复制代码
输出结果为:s=d  z v=c
作者: zaixinxiangnian    时间: 2011-9-23 10:47

这就是经验啊,,,,,,还没有听说过这种用法啊
作者: CrLf    时间: 2011-9-23 11:10

回复 9# stu_p


    当默认分隔符出现在引号对之外而未被转义时就会被转换成空格,举个例子,见此帖19楼最后一段:http://wapp.baidu.com/f/q-0-0-frontui_1256519797_224-pd%401%2Csz%40176_208%2C-1-1-0/m?kz=1184562813&lp=5010&pinf=1_1_0
作者: JooKin    时间: 2011-9-23 12:05

回复 11# CrLf


    请问CrLf版主:
  1. @echo off
  2. for /f "delims=" %%a in (""a;b;c;d A=B=C=D a,b,c,d"") do echo %%~a
  3. pause
  4. ::利用预处理的方法,高效但是适用范围很小
复制代码
这其中预处理是怎么进行的?%%a的值是"a;b;c;d A=B=C=D a,b,c,d",为什么%%~a就去掉了;=,?
作者: applba    时间: 2011-9-23 12:10

本帖最后由 applba 于 2011-9-23 12:15 编辑

对于 for /f "options" %%i in (set) do (cmds)

for命令中的 逗号 分号 空格 tab 等号 都是分隔符,如果是in和do后面的括号还可以使用 回车(换行)符号 做分隔符。

for命令的参数存在二次转义:
(1)cmd.exe在读取时,"options"参数的必须作为一个整体传送到for命令。因此,其中的空格、分号、等号、回车符号都必须转义,否则"options"将被截断为多个部分分次传递到for命令,导致出错。转义的方式可以是使用双引号连续,也可以是使用尖号逐个转义。当然了。如果的"options"中没有这些特殊符号,自然不需要任何转义的。如: for /f "usebackq" %%i in (set) do (cmds)  
(2)for命令之后会对传递过来的参数"options"进行自行解析,依据是关键字(tokens,delins等)和分隔符。上面转义过的空格、分号、等号、回车符号再次成为特殊符号,用于分割参数。
作者: stu_p    时间: 2011-9-23 12:18

本帖最后由 stu_p 于 2011-9-23 12:32 编辑

回复 11# CrLf
总算等到这种用法的第一人了~谢谢指点
你上面提供的链接怎么是下载文件???不是一个网页呀。。。。
作者: zaixinxiangnian    时间: 2011-9-23 12:34

是啊连接打不开
作者: CrLf    时间: 2011-9-23 13:39

本帖最后由 CrLf 于 2011-9-23 13:48 编辑

其实就是12楼的内容,我发的是爪机链接,pc上的是:http://tieba.baidu.com/p/1184562813?pid=14015225891&cid=0#14015225891
预处理时,for 把所有未被转义的默认分隔符“格式化”成空格,这也是顶楼代码必须对等号、逗号等进行转义的原因。那段例子就是为了说明这点,先让字符串被错误分隔,使其中的内容被“格式化”,再去除多余双引号就行了,说得比较乱,去掉回显试一下也许就懂了。所以平时碰到这种既有双引号也有默认分隔符的字符串时要留神,最好用变量延迟绕过针对语块的预处理。
作者: cjiabing    时间: 2011-9-25 13:24

回复 9# stu_p


    可能没说清楚,我说的分隔符不是针对集合〈括号〉的,而是针对参数的。for的参数一般要使用双引号,但他这里没有使用,是特例。你也可以这样试试:
for  /f  tonken=1 delims=  %%a  in ("a" b c") do echo;%%a
或:
for /f "token=1" "delims=" %%a in ("a b c") do echo;%%a
作者: 6508as    时间: 2018-9-10 17:50

本帖最后由 6508as 于 2018-9-10 17:51 编辑

回复 17# cjiabing

学习了




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