批处理技术内幕 ECHO命令介绍

2019-01-30 03:35:19丽君

可以看到,CMD对:.的处理跟+[]/不太一样,如果是+[]/,CMD会直接把它们从命令中删除并且添加到原有参数的前面;而如果是:.并且CMD拓展是开启的话,那么会多调用一次GetFileAttributes函数获取文件属性,多调用一次函数自然会多花一些时间,所以第三组的效率又稍稍比第二组的低些。 GetFileAttributes

再来解释一下为什么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%xn", GetFileAttributes("echo:"));
printf("0x%xn", GetFileAttributes("echo."));
printf("0x%xn", 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是文件夹而不是文件,没有问题。

最后总结一下吧,在大部分情况下,你都应该使用第一组的echo, echo; echo=来进行输出,它们的效率跟echo (空格)是一样的,并且可以用来输出on或者off,在变量为空时还能输出空行。

但是echo, echo; echo=却不能输出以/?开头的行,如果你需要,可以使用第二组的echo+ echo/ echo[ echo],它们的效率低一些,但能保证原样输出。

我不建议你使用第三组的echo: echo. echo,如果你仍然要像垃圾教程里面那样用,我也没有办法。
作者: Demon
链接: http://demon.tw/reverse/cmd-internal-echo.html

您可能感兴趣的文章:

批处理 Set 命令详解 让你理解set命令DOS批处理之DATE命令的使用方法详解dos命令或批处理 发生系统错误5 拒绝访问Windows下用命令行修改IP地址的方法详解(附批处理文件)Reg命令使用详解 批处理操作注册表必备windows批处理命令教程批处理命令Start的使用介绍批处理命令详解之目录跳转:cd批处理命令教学之tree命令批处理命令教学之if语句批处理命令教学之管道符号(|)批处理命令教学之复合语句连接符(&、&&和||)批处理命令教学之字符串排序(sort)批处理命令教学之more命令
相关文章 大家在看