从Windows批处理文件向控制台输出一个空行

203
当我需要从Windows批处理文件向控制台输出状态消息时,我希望输出空白行来分隔输出。我该如何做到这一点?

9
我不认为这个问题如何在批处理文件中回显换行符? 是重复的问题。那个问题的本质是:使用单个echo语句,如何输出两行文本并在它们之间加上一个换行符? 话虽如此,那个问题的几个答案也解决了如何输出空白(空)行的问题。 - DavidRR
2
由于此帖子不再接受答案...根据以下链接,正确的答案是echo:。http://ss64.com/nt/echo.html - H2ONaCl
总结一下ss64链接中关于echo的内容... echo.会搜索名为echo的文件,只有在找不到这样的文件时才会创建一个空行。这种特性使得echo.echo:更慢、更不健壮。 - u8it
3个回答

201

以下三个选项中的任何一个都适用于您:

echo[

echo(

echo. 
例如:
@echo off
echo There will be a blank line below
echo[
echo Above line is blank
echo( 
echo The above line is also blank.
echo. 
echo The above line is also blank.

13
请注意,"echo." 可能无法正常工作,请参考 https://dev59.com/gHVC5IYBdhLWcg3w-WOs#wY4ToYgBc1ULPQZFZd4g 下的评论。 - Pacerier
2
也不要像我这样傻乎乎地在 echo . 之间打空格。 - Cadoiz

154
注意:尽管我的原始答案吸引了几个赞,但我决定可以做得更好。您可以在编辑历史记录中找到我的原始(简单和误导性)答案。
如果微软有提供从cmd.exe输出空行的意图,那么微软肯定会记录这样一个简单的操作。正是这种遗漏促使我提出了这个问题。
因此,由于没有文档记录如何从cmd.exe输出空行,可以说任何建议都可以被认为是一个黑客方法。这意味着没有已知的方法可以保证在所有情况下有效地输出空行。
考虑到这一点,这里讨论了已经推荐用于从cmd.exe输出空行的方法。所有建议都基于echo命令的变体。
echo.

虽然在许多情况下这种方法可以运行,但应该避免使用,因为它比其它方法更慢且实际上可能会失败(请参见此处此处此处)。具体来说,cmd.exe首先搜索名为echo的文件并尝试启动它。如果当前工作目录中恰好存在名为echo的文件,则echo.将失败,显示以下内容:
'echo.' is not recognized as an internal or external command,
operable program or batch file.

echo:
echo\

这个答案的结尾处,作者认为这些命令可能会很慢,例如如果它们从网络驱动器位置执行。并没有给出潜在缓慢的具体原因。但可以推断它可能与访问文件系统有关。(也许是因为:\在Windows文件系统路径中具有特殊含义?)
然而,一些人可能认为这些是安全选项,因为:\不能出现在文件名中。因为这个或其他原因,SS64.com在这里推荐使用echo:
echo(
echo+
echo,
echo/
echo;
echo=
echo[
echo]

这篇详细的讨论 包含了我认为所有的这些选项。其中几个选项在这个SO答案中也被推荐。在引用的讨论中,这篇帖子以推荐使用echo(echo:结尾。

我在本页顶部的问题没有指定Windows版本。我的在Windows 10上的实验表明,无论当前工作目录中是否存在名为echoecho+echo,,...,echo]的文件,所有这些都会产生一个空行。(请注意,我的问题早于Windows 10的发布。因此,我承认旧版Windows可能会有不同的行为。)

这个答案中,@jeb断言echo( 总是有效。对我而言,@jeb的答案意味着其他选项不太可靠,但没有提供任何详细信息。请注意,@jeb为我引用的其他参考资料做出了很多有价值的贡献。


结论:不要使用echo.在我遇到的许多其他选项中,这两个选项的支持最为权威:

echo(
echo:

但是我没有发现任何强有力的证据表明使用它们将始终不会出现问题。


示例用法:

@echo off
echo Here is the first line.
echo(
echo There is a blank line above this line.

期望输出:

Here is the first line.

There is a blank line above this line.

16
echo., echo:, echo\, echo+, echo/, echo[, 和 echo] 不安全。当它们在 for /r 循环中使用时,例如 for /r %a (*) do echo.%a 等等,它们会将路径从上一个文件夹添加到下一个文件夹。echo(echo,echo;echo= 没有这个问题。 - tomasz86
1
更新:看起来微软现在在他们的文档中显示使用“echo。”来“在屏幕上回显空行”。Echo文档:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/echo 根据以前的评论/答案,似乎仍然不建议这样做。除非这种行为最近发生了改变? - Ben
ECHO.是安全的。所描述的问题是在Windows中使用任何命令时,如果在命令中添加了一个.,都会出现问题。当您需要确保不出现错误时,您可以始终将以下内容添加到批处理脚本的顶部:IF EXIST echo. DEL /Q echo. - Luuk

51

通常会建议使用 'echo' 命令。

但这样做速度较慢,而且可能会因为 cmd.exe 首先搜索名为 'echo'(无扩展名)的文件并且只有当该文件不存在时输出一行空白而导致失败并显示错误消息。

你可以使用 echo( 命令。它大约快了 20 倍,并且总是有效的。唯一的缺点可能是看起来很奇怪。

关于不同的 ECHO:/\ 变体的更多信息,请参见DOS 提示:ECHO. 失败未给出文本或空行


3
你有突出显示此问题的来源吗? - Taylor Hx
12
在我的看法中,担心批处理速度是完全无意义的——如果性能瓶颈存在于批处理文件中,你不应该试图优化它,而是应该抛弃它并用真正的编程语言重新编写。 - Matteo Italia
4
@MatteoItalia,这与速度无关。如果它正在执行额外的操作(首先搜索没有扩展名的名为“echo”的文件),那么就是错误的,如果有这样的文件,它确实会失败。如果批处理作业在周末失败,而所有人都在离一半国家远的地方狂欢,那就更加严重了。 - Pacerier
@jeb,那么关于较新版本的Windows呢? - Pacerier
1
@Pacerier 从XP到Win10似乎是相同的行为,自XP以来几乎没有什么变化。 - jeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接