(编辑:jimmy 日期: 2024/11/13 浏览:2)
可以看到,CMD对:.\的处理跟+[]/不太一样,如果是+[]/,CMD会直接把它们从命令中删除并且添加到原有参数的前面;而如果是:.\并且CMD拓展是开启的话,那么会多调用一次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%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是文件夹而不是文件,没有问题。
最后总结一下吧,在大部分情况下,你都应该使用第一组的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