批处理技术内幕 ECHO命令介绍
作者 佚名
来源 批处理
浏览
发布时间 2013-07-09
众所周知,如果echo后面跟一个环境变量,但是该变量却为空时,相当于不加任何参数的echo,即输出当前echo是on还是off。很多文章或者教程给出的解决方案都是在echo后面加一个点号echo.,这样就会输出空行。 复制代码 代码如下: @echo off echo %demon.tw% :: ECHO is off. echo.%demon.tw% pause据我所知,用echo输出空行至少有十种方法: 复制代码 代码如下: @echo off echo= echo, echo; echo+ echo/ echo[ echo] echo: echo. echo\ pause 这十种方法可以分为三组,每组的效率依次递减。可悲的是,那些被奉为经典的教程给出的却是效率最低那组中的echo. echo.不仅效率低下,而且还容易引发错误: 复制代码 代码如下: @echo off cd .>echo echo. pause 我知道你很难接受,但事实的确如此。 第一组中echo后面的=,;都是批处理中的分隔符,所以CMD可以正确地解析出echo命令,并把=,;作为echo命令的参数。是的,你没有看错,分隔符并不是用来分隔命令与参数,它们通常是参数的一部分。既然是参数,那么为什么不会被输出?那是因为echo命令直接跳过了参数的第一个字符,从第二个字符开始输出,而第二个字符是NUL,所以输出了空行。 你可能又要问,那为什么用空格做分隔符却不能输出空行呢?那是因为在输出之前,CMD要检查echo命令的参数是不是on或者off,或者参数为空:首先跳过所有空白字符,如果跳过之后字符串就结束了,那么就认为没有加参数,输出echo是on还是off;如果字符串没有结束,就调用wcsnicmp函数来判断剩下的字符串是否为on或者off,进而修改echo的状态。 因此加上很多空格也是一样的效果: 复制代码 代码如下: @echo off echo echo on echo pause 而对于第二和第三组,事情就没那么简单了,由于echo后面跟的并不是分隔符,所以解析之后会被当成一个整体,而echo+ echo/等等显然又不是内部命令,CMD会把它们当做外部命令进行搜索。嗯,你知道,搜索是很花时间的,这就是为什么它们的效率低于第一组。 可惜的是,CMD花了很大力气搜索,却仍然找不到这样的外部命令,这时候它会尝试着修复(Fix)命令,看看命令中是否有某些字符(如图):
再来解释一下为什么echo.有时候会引起错误。文件名中是不能出现:.\的,理论上GetFileAttributes函数都应该返回-1(INVALID_FILE_ATTRIBUTES),然而事实却不是如此,我也不知道这算不算GetFileAttributes函数的BUG: 复制代码 代码如下: #include <stdio.h> #include <windows.h> int main() { FILE *fp = fopen("echo", "wb"); fclose(fp); printf("0x%x\n", GetFileAttributes("echo:")); printf("0x%x\n", GetFileAttributes("echo.")); printf("0x%x\n", GetFileAttributes("echo/")); return 0; } 如果你测试一下上面的C程序,就会发现echo.那行返回的不是-1。 如果GetFileAttributes函数返回的不是-1(一般表示文件不存在),也不是0×10(表示文件是文件夹),那么命令还是会保持原来的样子,当成外部命令运行。 复制代码 代码如下: @echo off cd .>echo echo. pause ‘echo.'' is not recognized as an internal or external command, operable program or batch file. 复制代码 代码如下: @echo off cd .>echo setlocal disableextensions echo. pause 关闭了CMD拓展,没有问题。 复制代码 代码如下: @echo off md echo echo. pause echo是文件夹而不是文件 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: dos命令for用法详解下一篇: dos(cmd)中删除、添加、修改注册表命令
关于批处理技术内幕 ECHO命令介绍的所有评论