Board logo

标题: [其他] 做个实验了解批处理究竟是怎么执行的。 [打印本页]

作者: jakorzhang    时间: 2012-11-6 15:59     标题: 做个实验了解批处理究竟是怎么执行的。

对于echo off命令
市面上的教程总是说他用来关闭回显,是的,那些浅显的抄来的教程只能这么说 他懒的再深入的说了。对于一个学习批处理的新手来说,他是完全不知道回显是什么意思的。我就深受其害 所以我在写批处理教程的时候是绝不会简单说一句关闭回显来搪塞人的。
读到这里的你也思考思考这个回显究竟是什么 你知道吗?
甚至有些批处理已经入门的同志也只是错误的认为关闭回显就是关闭命令行和前面那个路径。你知道开启回显时命令行的执行过程吗?
做一个实验 输入以下代码:
  1. (echo hello world!
  2. exit
  3. echo will u see this line?)>0.txt
  4. start 0.txt
复制代码
也许有人认为这代码是存在严重错误的。是不是错误先不说 这样写是有安排的。
你说start 0.txt这个命令会执行吗?答案是肯定的 不会
那你说如果我双击这个bat 他都会做什么?看看截图 历历在目:

从这个图 再对照代码 你可以真真切切知道批处理的执行过程:
以行为单位读取批处理命令这个行不是你记事本里面的一行两行 这里的行是用一个换行符号来标记的 在没遇到行结束符号前 所有的代码都是一行。
在这个代码里第一行就是括号里面的读取完了做什么呢?
由于回显命令是打开的,cmd命令会把读取到的命令原原本本的显示在框里的
而你会发现start 0.txt并没有显示
这也基本上解释了变量延迟的原理了
cmd程序首先读取一行命令 先做预处理!
从哪里看出做了预处理了呢?
你看最后一行的1>0.txt
对照源代码 1从哪里来?
已经入门的知道这是句柄。
处理完以后执行这一行命令
我也不知道发这个帖子的目的是什么 我就是想说 想告诉你这个过程是怎么回事。
作者: Demon    时间: 2012-11-6 16:42

本帖最后由 Demon 于 2012-11-6 16:48 编辑

敢问楼主用的是Windows 9吗?这样的代码不报错也就算了,居然还会自动加上重定向。
作者: jakorzhang    时间: 2012-11-6 16:51

本帖最后由 jakorzhang 于 2012-11-6 16:53 编辑

回复 2# Demon


    中校 别小气 给指点指点怎么错了?是说那个重定向没加上吧 我也那么 我写帖子的时候明明有的 一发布怎就么了。。
作者: Demon    时间: 2012-11-6 17:00

本帖最后由 Demon 于 2012-11-6 17:01 编辑
回复  Demon


    中校 别小气 给指点指点怎么错了?是说那个重定向没加上吧 我也那么 我写帖子的时候 ...
jakorzhang 发表于 2012-11-6 16:51


你代码里的括号是中文的。
作者: BAT-VBS    时间: 2012-11-6 20:10

以行为单位读取批处理命令这个行不是你记事本里面的一行两行 这里的行是用一个换行符号来标记的 在没遇到行结束符号前 所有的代码都是一行。

按照你的理论,顶楼代码里面总共有几个换行符号?分别在什么地方?
作者: jakorzhang    时间: 2012-11-7 09:21

回复 5# BAT-VBS


    真为难我了 我正学这呢 我也想知道。等我学会了来回答啊。如果谁知道就给指点指点吧。
作者: CrLf    时间: 2012-11-7 17:23

回复 6# jakorzhang


    大致说一说,() 内的属于同一复合语句,以 &、&&、|或|| 相连的多条语句也是符合语句,是保存在内存里连续执行的,而普通的单条语句就只执行到换行符为止再读入下一条命令,不妨参考:
批处理技术内幕:预处理
作者: jakorzhang    时间: 2012-11-7 17:36

回复 4# Demon


    中校!像你致敬!你那那一批的批处理内幕写的真是直捣黄龙 针针见血!我也在思考和你曾经一样的问题 批处理究竟是怎么编译的。我要好好研究研究你的那几篇文章 不懂了再向您请教啊。




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