如何在批处理文件中使用echo输出换行符?

779
如何在批处理文件输出中插入换行符号?
我想要做这样的事情:
echo hello\nworld

将输出:

hello
world

9
对我很有用。我需要在脚本中运行 echo \n \n | my_app.exe。我运行了 (echo. && echo.) | my_app.exe。 - Vignesh
2
简单方法 "代码开始:" > echo hello&echo world,将给您所需的内容 - prudviraj
2
您可以在单独的一行上插入一个不可见的ASCII字符(255),这将强制产生一个空白新行。按住[alt]键,然后在小键盘上按下255。这将插入chr(255),它是一个空白方块。即"echo (alt+255)"。您只能使用小键盘,而不能使用querty键盘上面的数字键! - jwzumwalt
1
@jwzumwalt,感谢您提供的alt+255建议,在命令行上非常有效。 - K Vij
printf "\n\n\n" - Mark
显示剩余3条评论
27个回答

681

使用:

echo hello
echo:
echo world

32
在单个echo语句中提供一个字符串是可能的吗? - Brian R. Bondy
8
为什么你需要使用一个单独的echo语句来完成它;如果有另一个,会有什么问题吗? - Rob
7
@Rob,你能不能回答Brian R Bondy的问题?他并没有要求提供其他方法。 - Green
7
使用 &(或 &&)将它们放在单个语句中执行:例如,要将“hello\nworld”放入txt文件中:(echo hello & echo world) >> ./test.txt - Ned Martin
4
要将多行内容输出到文件,为什么不直接采用以下方式:echo line 1 > Makefile 然后再执行 echo line 2 >> Makefile。使用 >> 可以将输出附加到文件的末尾,这正是您在此情况下所需要的行为。 - dgnuff
显示剩余6条评论

534

echo hello & echo.world

这意味着你可以将& echo. 定义为代表换行符\n 的常量。


58
示例代码不需要句号,但要在代码中添加一个句号以生成空行:echo. && echo hello && echo. && echo world - matt wilkie
6
你能用一条echo命令完成这个任务并将结果重定向到一个文件中吗? - Shahbaz
56
@Shahbaz - $ (echo 你好 && echo 世界) > ./文件.txt - Nathan J.B.
29
“echo.”中的句号总是让我感到惊奇。它太过时了,但我总是忘记这个点必须与命令名称严格连接,之间不能有空格。你的文章中没有错误,我写这篇提醒只是为了强调:“echo .”不等于“echo.”! - quetzalcoatl
7
@quetzalcoatl,情况变得更加奇怪了。除了句点外,其他字符也可以使用。SS64表示更好的语法是echo(,以提高性能(仍然不要有空格)。关于其他字符及其优点/缺点的详细讨论,请参见ECHO. FAILS to give text or blank line - Instead use ECHO/ - matt wilkie
显示剩余12条评论

160

好的,您可以创建一个 .bat 文件,并将以下内容添加到其中:

@echo off
REM Creating a Newline variable (the two blank lines are required!)
set NLM=^


set NL=^^^%NLM%%NLM%^%NLM%%NLM%
REM Example Usage:
echo There should be a newline%NL%inserted here.

echo.
pause

你应该看到类似以下的输出:
There should be a newline
inserted here.

Press any key to continue . . .

显然,你只需要在 REM 语句之间的代码。


65
非常令人印象深刻,你可以花点时间解释一下这行代码的工作原理吗?set NL=^^^%NLM%%NLM%^%NLM%%NLM%这行代码是在Windows命令提示符中用来设置一个名为"NL"的环境变量。它使用了一些特殊字符来实现这一目的。首先,^^^代表转义序列,表示一个插入符号(^)。接着,%NLM%表示另一个环境变量"NLM"的值。连续使用两个%可以让Windows知道这是一个环境变量的引用。最后,两个插入符号之间的内容(即%NLM%%NLM%)会被复制到"NL"环境变量中。因此,这行代码的含义是:将两个"NLM"环境变量的值连接起来,并将结果存储在"NL"环境变量中。 - Andy Morris
11
@andy 我认为一个+8的评论值得提出一个问题:https://dev59.com/ymw15IYBdhLWcg3w0fAV - matt wilkie
104
这是一个很好的例子,可以表明cmd.exe和Windows批处理文件是完全不可理喻的! - mivk
17
注意事项:第一行“set NLM=^”后面必须没有任何字符,在此行之后必须有两个空行 - mnemotronic
11
看看我提供的更简单的方法。使用set nl=^&echo.,然后只需输入echo hello %nl% world即可产生相同的效果。 - user2605194
显示剩余7条评论

120

在 cmd/bat 文件中有一个标准功能 echo: 可以输出空白行,这样可以模拟 cmd 输出中的新行:

@echo off
echo line1
echo:
echo line2
或者
@echo line1 & echo: & echo line2

上述cmd文件的输出:

line1

line2

41
实际上,任何未使用的特殊字符都应该起作用。我总是鼓励使用 /,因为斜杠是命令选项的标准字符。同时,我也一直批评微软中某些人不幸选择使用点号,因为命令“echo.com”在不同版本的MS-DOS/Windows批处理命令处理器中会产生不同的结果。 - Aacini
27
始终有效的版本是 echo()。它看起来可能会引起问题,但实际上完美地发挥作用。所有其他形式都至少有一种情况,在该情况下,命令不会按预期执行。 - dbenham
8
@naxa - 没有正式的内容,只是由几个批处理黑客得出的集体知识。目标是创建可以用于ECHO任何值(包括空值)的语法,而不必担心得到除预期之外的任何内容。我所知道的最好的总结在http://www.dostips.com/forum/viewtopic.php?p=4554#p4554。它有点让人摸不着头脑,但没有人能提出一个`ECHO(`会失败的情况。 - dbenham
3
@Pacerier - 每个建议都有失败的例子。请仔细阅读http://www.dostips.com/forum/viewtopic.php?p=4554#p4554。 - dbenham
5
@Pacerier,这里有足够的“回声”以作为一个独立的问题。也许可以采用类似以下的方式提问:“在使用echo命令时,有哪些字符可以紧随其后,以及它们的效果是什么?” - matt wilkie
显示剩余8条评论

87

类似于Ken的回答,但使用延迟扩展。

setlocal EnableDelayedExpansion
(set \n=^
%=Do not remove this line=%
)

echo Line1!\n!Line2
echo Works also with quotes "!\n!line2"
首先创建一个单个换行符并将其赋给\n变量。
这是因为行尾处的插入符尝试转义下一个字符,但如果这是一个换行符,则会忽略它并读取和转义下一个字符(即使这也是一个换行符)。
然后需要第三个换行符来结束当前指令,否则第三行将附加到LF变量上。
即使批处理文件的行尾只有CR/LF,LF也很重要,因为CR在解析器的此阶段中被删除。
使用延迟扩展的好处在于根本没有特殊字符处理。
"echo Line1%LF%Line2"将失败,因为解析器停止解析单个换行符。
更多解释请参见
SO:在Vista/DOS批处理(.bat)文件中拆分多行的长命令
SO:Windows命令解释器(CMD.EXE)如何解析脚本? 编辑:避免使用echo. 这不是答案,因为问题是关于能够输出多行的单个echo
尽管其他答案建议使用echo.创建新行,但应注意,echo.是最慢的,并且可能会完全失败,因为cmd.exe搜索名为ECHO的文件并尝试启动它。
要打印一个空行,您可以使用以下之一。
echo,
echo;
echo(
echo/
echo+
echo=

但应避免使用echo.echo\echo:,因为它们可能非常缓慢,取决于脚本执行的位置,如网络驱动器。


2
如果您将带有换行符的字符串作为批处理子例程的参数传递,例如 call :pause line1!\n!line2,请在子例程中使用 setlocal EnableDelayedExpansion 开始,并以 setlocal DisableDelayedExpansion 结束,以防止换行符被过早解释。 - stevek_mcc
3
对于字符集 echo, echo; echo( echo/ echo+ echo= 和反派角色集合 echo. echo\ echo: 给予一颗加分。如果你能解释这些奇怪的东西为什么能够工作,我将欠你一瓶免费啤酒。 - Bob Stein
1
@johnywhy 是的,请将代码移动到 newline.bat 中,最好加上 echo(!\n! - jeb
@jeb 你是说当我从.bat文件中使用它时,我必须使用一个开放括号吗?闭合括号应该放在哪里?echo(!\n! 我的意图是在每个想要使用你的方法的批处理文件的顶部调用外部setup_newline.bat。或者,更好的办法是,在需要换行符的任何地方都放置“newline”,并让该“newline”调用“newline.bat”,返回“!\n!”。 - johny why
@johnywhy 最好提出一个新问题,因为评论区对于更长的描述来说有点小。 - jeb
显示剩余3条评论

45

echo. 话不多说。

如果您需要在一行内显示,请使用 &。例如:

echo Line 1 & echo. & echo line 3

将输出为:

Line 1

line 3

现在,假设你想要更高级一些的东西,...
set n=^&echo.
echo hello %n% world

输出

hello
world

那么,只需在echo语句中想要换行的地方添加%n%。这更接近各种语言中使用的\n
分解: set n=将变量n设置为: ^清空接下来的符号: &表示在同一行上执行另一个命令。我们不关心错误级别(它是一个echo语句,不用大惊小怪),因此不需要&&echo.继续echo语句。
所有这些都能够工作是因为实际上可以创建代码变量,并在其他命令中使用它们。这有点像贫民窟函数,因为批处理不是最先进的shell脚本语言。这只能在批处理的变量使用不佳时起作用,无法自然区分int、char、float、string等。
如果你足够聪明,还可以将其用于其他事情。例如,使用它来echo制表符。
set t=^&echo.     ::there are spaces up to the double colon

9
不要使用 echo.,因为它首先会尝试找到一个同名的文件。使用其他标点符号,比如 echo, - Kuba hasn't forgotten Monica
1
执行echo %n%hello%n%world会失败,正确的写法是echo & echo:hello & echo:world - Gerold Broser

20

如果要将内容输出到文件中,多个“echo”命令是不会起作用的。我认为“>>”重定向符可能是一个不错的选择:

echo hello > temp
echo world >> temp

8
第一个例子使用符号 ">", 会创建一个新文件,第二个例子使用符号 ">>",会将内容追加到已存在的文件中(如果文件不存在,则创建一个新文件)。 - Yann Duran
1
“(echo hello && echo world) > temp” 这个命令在 Nathan J. Brauer 的评论中提到,它是可行的。 - Gerold Broser

18

如果您需要将结果写入文件,您可以使用:

(echo a & echo: & echo b) > file_containing_multiple_lines.txt

14

就像Grimtron建议的那样 - 这里有一个快速的示例来定义它:

@echo off
set newline=^& echo.
echo hello %newline%world

输出

C:\>test.bat
hello
world

它实际上会在“world”后面回显一个额外的换行符。 - BlueRaja - Danny Pflughoeft
1
@blue,结尾的换行符似乎是批处理文件本身的一个功能。如果您重复echo hello %newline%world这一行,则之间没有空格。 - matt wilkie
4
由于"Hello %newline% world"被包含在引号中,因此echo命令会失败。这是因为它不是一个真正的换行符。 - jeb
1
我到处都看到这个,它很容易误导/混淆,并且与真正的换行版本相比效率非常低下。 - ScriptKidd
@HaxAddict1337,“真正的换行版本”是哪个? - johny why
执行echo %newline%hello%newline%world会失败,正确的写法是echo & echo:hello & echo:world - Gerold Broser

9

你也可以这样做:

(for %i in (a b "c d") do @echo %~i)

输出结果将是:
a
b
c d

请注意,当这个命令放在批处理文件中时,'%'需要加倍写成'%%'。
(for %%i in (a b "c d") do @echo %%~i)

如果你想回显一个&符号而不是换行符,这个解决方案同样适用。 - parvus
我认为我发现了一个错误:*字符。 - user6250760
这是一个不必要复杂的 echo a & echo b & echo c d,并且不能用 echo a sentence that contains\na newline identifier in it 来回答问题。当然,可以写成 for %%i in ("a sentence that contains" "a newline in it") do @echo %%~i,但真的需要吗? - Gerold Broser

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