[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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

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

回复 17# cjiabing

学习了

TOP

回复 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
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

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

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

TOP

是啊连接打不开

TOP

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

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

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

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

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

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

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

  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

后面是因为有特殊的"才用转义的,前面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
复制代码
我的意思是改成上面这样,但是得不到正确结果。
后面是因为有特殊的"才用转义的,前面1*都不是特殊符号啊,请问为什么前面也要转义呀?
学习...

TOP

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

TOP

返回列表