找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 89353|回复: 17

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

[复制链接]
发表于 2011-9-22 18:01:33 | 显示全部楼层 |阅读模式
  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小时什么的~~

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2011-9-22 19:22:58 | 显示全部楼层
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技术 +1 收起 理由
stu_p + 1 问题基本解决

查看全部评分

发表于 2011-9-22 20:58:55 | 显示全部楼层
回复 1# stu_p
这也需要转义?
  1. tokens^=1*^
复制代码
下面这样不是一样的么,干嘛多此一举?
  1. tokens=1*
复制代码
发表于 2011-9-22 21:00:48 | 显示全部楼层
回复 2# Hello123World

向你确认下,你举例的那句代码前两个转义是不是多余的,去掉也可以吧?
发表于 2011-9-22 21:04:14 | 显示全部楼层
回复 4# xudaweb
  1. @echo off
  2. for /f "tokens=1* delims="" %%a in ("sd"z"vc") do echo %%b
  3. pause
复制代码
不转义就这么写,但是这么写是得不到正确结果的;不多余,是必须的。
发表于 2011-9-22 21:20:52 | 显示全部楼层
  1. @echo off
  2. for /f tokens=1* delims^=^" %%a in ("sd"z"vc") do echo %%b
  3. pause
复制代码
我的意思是改成上面这样,但是得不到正确结果。
后面是因为有特殊的"才用转义的,前面1*都不是特殊符号啊,请问为什么前面也要转义呀?
 楼主| 发表于 2011-9-22 21:42:26 | 显示全部楼层
后面是因为有特殊的"才用转义的,前面1*都不是特殊符号啊, ...
xudaweb 发表于 2011-9-22 21:20

我的理解是忽略了=和空格,成了tokens1*....没分隔符了,不知道对不对~
发表于 2011-9-22 22:33:05 | 显示全部楼层
  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技术 +1 收起 理由
wc726842270 + 1 学习

查看全部评分

 楼主| 发表于 2011-9-23 10:01:40 | 显示全部楼层
本帖最后由 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
发表于 2011-9-23 10:47:24 | 显示全部楼层
这就是经验啊,,,,,,还没有听说过这种用法啊
发表于 2011-9-23 11:10:54 | 显示全部楼层
回复 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
发表于 2011-9-23 12:05:53 | 显示全部楼层
回复 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就去掉了;=,?
发表于 2011-9-23 12:10:04 | 显示全部楼层
本帖最后由 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等)和分隔符。上面转义过的空格、分号、等号、回车符号再次成为特殊符号,用于分割参数。
 楼主| 发表于 2011-9-23 12:18:56 | 显示全部楼层
本帖最后由 stu_p 于 2011-9-23 12:32 编辑

回复 11# CrLf
总算等到这种用法的第一人了~谢谢指点
你上面提供的链接怎么是下载文件???不是一个网页呀。。。。
发表于 2011-9-23 12:34:07 | 显示全部楼层
是啊连接打不开
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 18:35 , Processed in 0.021592 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表