千家信息网

批处理中ECHO命令有什么用

发表于:2024-11-19 作者:千家信息网编辑
千家信息网最后更新 2024年11月19日,这篇文章给大家分享的是有关批处理中ECHO命令有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。众所周知,如果echo后面跟一个环境变量,但是该变量却为空时,相当于不加
千家信息网最后更新 2024年11月19日批处理中ECHO命令有什么用

这篇文章给大家分享的是有关批处理中ECHO命令有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

众所周知,如果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)命令,看看命令中是否有某些字符(如图):


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

再来解释一下为什么echo.有时候会引起错误。文件名中是不能出现:.\的,理论上GetFileAttributes函数都应该返回-1(INVALID_FILE_ATTRIBUTES),然而事实却不是如此,我也不知道这算不算GetFileAttributes函数的BUG:

代码如下:


#include
#include

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\,如果你仍然要像垃圾教程里面那样用,我也没有办法。

感谢各位的阅读!关于"批处理中ECHO命令有什么用"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

命令 输出 参数 代码 字符 效率 文件 函数 分隔符 空行 变量 字符串 教程 空格 还是 搜索 事实 内容 文件夹 文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 技术兼职软件开发 维普数据库提供的检索入口 服务器硬盘插电脑显示不出来 网络安全管理体系论文 如何将数据库中的表格保存为excel 有什么好的夺宝软件开发 串口服务器哪里可以买 网络安全日志分析模型 电商平台软件开发中心 2016大学生网络安全测试 bim数据库中国建材供应商 我国网络技术的发展历史特点 软件开发能认证抖音蓝V吗 安天网络安全国家队 网络安全面临的问题不包括 网络安全教程新手入门 数据库如何查询59开头的数字 服务器机房运维内容 网络安全管理体系证书认证品牌 闵行区银联数据库活动简介 兴动网络安全协会 如何进行网络安全工作 公共目录服务器IP地址 淘宝客户数据库 怎样避防网络安全风险300字 如何搭建vps服务器 两种网络安全模型的特点 软件开发专员任职要求 维护网络安全的工具有哪些 服务器设置中pop3服务是指
0