Board logo

标题: [其他] [讨论]批处理重定向符号的任意位置效果相同 [打印本页]

作者: applba    时间: 2011-5-19 15:27     标题: [讨论]批处理重定向符号的任意位置效果相同

本帖最后由 applba 于 2011-5-19 23:44 编辑

任意位置效果相同。
>>1.txt echo  abc def
echo>>1.txt  abc def
echo  abc>>1.txt def
echo  abc def>>1.txt


测试代码
  1. @echo off &echo.>1.txt
  2. >>1.txt echo  abc def
  3. echo>>1.txt  abc def
  4. echo  abc>>1.txt def
  5. echo  abc def>>1.txt
  6. start 1.txt
  7. pause
复制代码

作者: Hello123World    时间: 2011-5-19 16:38

你的研究总能给我不少启发。
作者: CrLf    时间: 2011-5-19 16:44

本质是,cmd对语句进行预处理的时候,把“(句柄名称)(重定向符号)(目标句柄或设备)”这一段识别出来再挪到语句末尾,所以放哪里都可以。
作者: applba    时间: 2011-5-19 17:10

3# zm900612


这个处理是由具体的命令进行的,此例是echo。

但是我认为呢,>>的处理和^是类似,是处理后消失,而不是移动到末尾。
作者: CrLf    时间: 2011-5-19 17:47

转义是转义,语句划分是语句划分,二者不一样的。这很容易证明,运行下列命令就知道了,注意看回显:
  1. echo on
  2. echo afds^asdf
  3. echo sdf >con sef
  4. pause
复制代码

作者: applba    时间: 2011-5-19 18:11

本帖最后由 applba 于 2011-5-19 18:13 编辑

5# zm900612

^和>的功能肯定不一样。
我的意思说 处理后的效果:即处理后消失。
作者: CrLf    时间: 2011-5-19 22:19

怎么去区别“被处理后消失”和“被区分后失效”呢?
作者: powerbat    时间: 2011-5-19 22:31

任何功能符号在预处理后都“消失”了,它们只是用来告诉CMD按什么逻辑和规则执行语句。

一句话,“预处理时判定语句的结构和功能”。
作者: CrLf    时间: 2011-5-19 22:55

8# powerbat


唔,貌似这个说法更标准
作者: qzwqzw    时间: 2011-5-19 23:20

说法这么混乱
只因为大家对预处理的概念理解不一
预处理是个相对笼统的概念
在批处理开启echo on后
回显的命令行已经是预处理的结果
至于这以后对命令行的分析算不算预处理
没有标准的界限定义
而且不同命令的预处理过程也是不同的
作者: CrLf    时间: 2011-5-19 23:32

嗯,反正谁对我听谁的...
作者: applba    时间: 2011-5-19 23:47

本帖最后由 applba 于 2011-5-20 03:55 编辑

7# zm900612


首先,要识别出来它是特殊符号。
然后,解释其功能,即通常所说的(预)处理。

解释完了,特殊符号的使命就完成了,可以“消失”了
作者: qzwqzw    时间: 2011-5-20 08:26

可以确定的是
cmd对 & | > >> < & && ||的处理是大体上分为两步的
第一步是对这些符号进行整理
包括对> <添加默认句柄号
对以上符号前后预留空格
对< >以及句柄对应的文件移到语句尾部

第二步是对这些符号进行处理
创建打开文件
复制文件句柄等
处理完这些符号后
整体语句的分析就已已经结束
这里不存在刻意的符号丢弃或者消失
作者: applba    时间: 2011-5-20 20:07

13# qzwqzw


为什么会要移动呢,不是很理解。
我觉得这个重定向符号就像是一个信使,和人接头 了,就可以走了。
作者: qzwqzw    时间: 2011-5-20 20:19

忘了提到一点
cmd对 & | > >> < & && ||的两步处理是不连续的
中间夹杂着其它的一些命令行处理代码
第一步的所有整理操作
都是为了使命令行更加清晰和标准
让第二步的处理过程能够更加简便
作者: CrLf    时间: 2011-5-20 20:23

14# applba


请看5楼例子,不要关回显。
微软不开源,所以bat中很多似是而非的东西只好用不断推翻错误猜想的方式去探究,烦啊...
作者: applba    时间: 2011-5-20 20:34

看来我是搞不透这些个机制了,还是不搞了吧……
作者: powerbat    时间: 2011-5-20 20:48

把echo off去掉,一切了然。

首先当然无条件处理%,然后处理^,然后是qzw说的那些。
预处理结束后,那些功能符号当然“消失”了(对CMD来说)。因为已经创建了句柄,为管道两边的命令准备了创建进程所需参数,对语句块(包括&、&&、||等)确定了程序流程和逻辑,等等。比如,假设转换成C语言,
cmd1&cmd2&cmd3 → cmd1();cmd2();cmd3();
cmd1&&cmd2||cmd3  → cmd1() ? cmd2() : cmd3()
作者: applba    时间: 2011-5-20 20:54

把echo off去掉,一切了然。
结果我发现它真的移了……
作者: CrLf    时间: 2011-5-20 21:01

把echo off去掉,一切了然。
结果我发现它真的移了……
applba 发表于 2011-5-20 20:54

看来我白举例了...




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