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

[文本处理] [已解决]批处理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小时什么的~~
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

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

这个规律是zm发现的,利用的是预处理的解释机制,具体原理可以请教zm的代言人,ctrl君(可能是这个名字,我只记得zm……)
1

评分人数

    • stu_p: 问题基本解决技术 + 1

TOP

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

TOP

回复 2# Hello123World

向你确认下,你举例的那句代码前两个转义是不是多余的,去掉也可以吧?
学习...

TOP

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

TOP

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

TOP

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

我的理解是忽略了=和空格,成了tokens1*....没分隔符了,不知道对不对~

TOP

  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
复制代码
1

评分人数

寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

本帖最后由 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

TOP

这就是经验啊,,,,,,还没有听说过这种用法啊

TOP

回复 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

TOP

回复 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就去掉了;=,?

TOP

本帖最后由 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等)和分隔符。上面转义过的空格、分号、等号、回车符号再次成为特殊符号,用于分割参数。

TOP

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

回复 11# CrLf
总算等到这种用法的第一人了~谢谢指点
你上面提供的链接怎么是下载文件???不是一个网页呀。。。。

TOP

是啊连接打不开

TOP

返回列表