[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
cmd /q /c for /f %a in ('"for /f %a in ('echo 5678')do echo %a"')do echo %a多了一层就抓不到,这是怎么回事:cmd /q /c for /f %a in ('"for /f %a in ('"for /f %a in ('echo 1234')do echo %a"')do echo %a"' ...
plp626 发表于 2011-5-25 16:53
  1. cmd /q /c for /f %a in ('"cmd /q /c for /f %a in ('for^ /f^ %a^ in^ ('echo^ 1234'^)do^ echo^ %a')do echo %a"') do echo %a
复制代码

TOP

19楼,你测试了否? 我这里照样没法抓到。。

TOP

测试的时候是没加cmd /q /c的,不过有回显,所以发贴的时候就在for内加了cmd /q /c,把它去掉就看到了:
  1. cmd /q /c for /f %a in ('"for /f %a in ('for^ /f^ %a^ in^ ('echo^ 1234'^)do^ echo^ %a')do echo %a"') do echo %a
复制代码

TOP

那次你那个引号的分隔符。。。
细想了下,还真是预处理的关系:
  1. cmd /q /c for /f %a in ('"for /f %a in ('for,/f,%a,in,^('echo,1234'^)do,echo,%a')do echo %a"') do echo %a
复制代码
但还在想其中缘由,,,

TOP

为什么空格在这里就不能再作为参数分割符,而要用逗号,分号或者等号?
  1. cmd /q /c for /f %a in ('"for /f %a in ('for=/f=%a=in=^('echo,1234'^)do=echo=%a')do echo %a"') do echo %a
复制代码

TOP

给空格加转义多此一举,这里主要是括号的原因:
  1. cmd /q /c for /f %a in ('"for /f %a in ('for /f %a in ^('echo,1234'^)do echo %a')do echo %a"') do echo %a
复制代码
参数分隔符在过程中仍旧还是:空格,制表符,逗号,分号,等号

TOP

原因来自括号匹配:
  1. cmd /q /c for /f %a in ('"for /f %a in ('for /f %a in ('echo,1234'^)do echo %a')do echo %a"') do echo %a
复制代码

TOP

本帖最后由 plp626 于 2011-5-25 18:52 编辑

可以这样理解for的二次预处理特性:
for ~ cmd内部的一个类似call的子过程。。。

这个内部子过程有/r /d /f 三个开关,有共同的do in 关键字,一对括号,有最多32个连续单字符名的内置变量
(相对call,若不shift则为10个);

/f 开关有eol,skip,usebackq,delims,tokens,5个关键字,他们作为/f开关的 “第一个参传递”

调用这个子过程的时候,参数分割符同call的参数分隔符;

TOP

我原来以为是for /f 的嵌套输出没有按预期输出,是不是和什么句柄有关。。。所以发了那样的疑问。。。

后面验证时和括号匹配有关。。。

遂把自己对for的理解一块放这里,好作为一个思考连贯的过程。。。

在我看来没有什么不会联系到一起的。。。

TOP

27# qzwqzw
应楼主的要求,每人扣除1000分。。。

呵呵,先记着(缓期执行)。。。

两位兄弟研究的热情和精神让人佩服,但你们是不是也照顾下楼主的感受,另发贴讨论不是更好吗。。。
***共同提高***

TOP

25# batman


汗,plp兄的话题激起了我的兴趣,光顾着讨论,没顾及楼主的感受,sorry...

TOP

返回列表