如何在批处理文件中回显换行符?


641

如何从批处理文件输出中插入换行符?

我想做类似的事情:

echo hello\nworld

哪个会输出:

hello
world

6
对我有用。我必须做回声\ n \ n | 脚本中的my_app.exe。我做到了(回声&&回声)my_app.exe
Vignesh

2
简易方法“代码开始:”> echo hello&echo world,将为您提供所需的信息
prudviraj 2015年

1
您可以在单独的行上插入不可见的ascii chr(255),这将强制出现空白行。按住[alt]键并按键盘上的255。这将插入chr(255),这是一个空白正方形。即“ echo(alt + 255) ”您只能使用小键盘,而不能使用键盘顶部的数字!
jwzumwalt

正如一半的计算机维修工作要插入并打开它一样,一半的软件开发工作就是我所说的太空工程。我们只需要空白行。
鲍勃·斯坦

这个怎么样 ?echo Yes&echo No
scientist_7

Answers:


461

echo hello & echo.world

这意味着您可以& echo.为换行符定义一个常量\n


43
该示例不需要句点,但是您确实需要一个echo. && echo hello && echo. && echo world
句点来回显

4
您可以使用单个回显来做到这一点,以便将其重定向到文件吗?
沙巴兹(Shahbaz)

46
@Shahbaz -$ (echo Hello && echo World) > ./File.txt
弥敦道JB

25
“回声”中的时期物。永不止息。它已经过时了,但我仍然始终忘记点必须严格与命令名称连接在一起,并且之间不能有空格。在您的帖子中没有错误,我只是为了提醒您:“ echo”。!=“回声。!
quetzalcoatl 2012年

5
@quetzalcoatl,它变得更加陌生。除点以外的其他字符也可以使用。SS64说更好的语法是echo(为了提高性能(仍然没有空间)。在ECHO上
matt wilkie 2015年

557

采用:

echo hello
echo.
echo world

16
在单个echo语句中提供字符串时是否可以?
Brian R. Bondy

5
为什么需要使用单个echo语句来完成此操作?拥有另一个有害在哪里?
罗布

3
@Rob,我只是遇到了这个问题,而这些都不起作用。在我的示例中,您需要回显单个语句。我正在通过HTML生成一些tex文件,并通过使用echo "Makefile contents (which has \n)" > Makefile带有多个回显来生成Makefile ,这是行不通的
Shahbaz

3
使用&(或&&)在单个语句中进行操作:例如,将“ hello \ nworld”放入txt文件中:(echo hello & echo world) >> ./test.txt
Ned Martin

4
对于多行输出到文件,为什么不执行以下操作? echo line 1 > Makefile然后echo line 2 >> Makefile。使用>>cause会将输出附加到文件,这恰恰是这种情况下所需的行为。
dgnuff

141

在这里,创建一个.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语句之间的代码。


51
非常令人印象深刻,您能否花点时间来解释NL = ^^^%NLM %% NLM%^%NLM %% NLM%的行是如何工作的?我不太明白这件事
安迪·莫里斯

8
@andy记错+8的评论令一个问题:stackoverflow.com/questions/6379619/...
马特·威尔基

82
这是一个很好的示例,表明cmd.exe和Windows批处理文件完全是疯狂的!
mivk 2011年

12
自言自语:行“ set NLM = ^” 在CARET之后必须没有任何内容,并且在其之后必须有2空行。
mnemotronic

4
请参阅我的答案以获取更简单的方法。 set nl=^&echo.,则echo hello %nl% world产生相同的效果。
coltonon

96

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

@echo off
@echo line1
@echo:
@echo line2

以上cmd文件引用的输出:

line1

line2

37
实际上,任何未使用的特殊字符都应该起作用。我始终鼓励使用/,因为斜杠是命令选项的标准字符。另外,我总是批评使用Microsoft中某些人不幸选择的点,因为命令:echo.com根据MS-DOS / Windows Batch命令处理器的版本给出不同的结果。
阿齐尼2011年

21
始终有效的唯一版本是echo(。看起来可能会引起问题,但实际上效果很好。所有其他形式至少有一种情况,该命令将无法按预期执行。
dbenham

5
@naxa-没什么官方的,只是一些黑客的集体知识。目标是拥有可用于回显任何值(包括不包含任何值)的语法,并且永远不必担心会得到除预期之外的任何东西。我知道的最好的总结是在dostips.com/forum/viewtopic.php?p=4554#p4554。有点让人不知所措,但是没人能想到ECHO(失败的场景。
dbenham

2
@Pacerier-每个建议都有失败的例子。仔细阅读dostips.com/forum/viewtopic.php?p=4554#p4554
dbenham

2
@Pacerier 在这里有足够的回声,可以解决一个独立的问题。也许遵循“什么字符可以立即跟随echo,它们的作用是什么”的思路?
马特·威尔基

68

就像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:,因为它们可能真的很慢,具体取决于脚本执行的位置(例如网络驱动器)。


1
如果要将带有换行符的字符串作为参数传递给批处理子例程,例如call :pause line1!\n!line2,以开头该子例程并以该子例程setlocal EnableDelayedExpansion结束,setlocal DisableDelayedExpansion以防止过早地解释换行符。
stevek_mcc

2
+1角色echo, echo; echo( echo/ echo+ echo=和流氓画廊的演员echo. echo\ echo:。现在,如果您要解释为什么要干这些事,我欠您一杯免费啤酒。
鲍勃·斯坦

40

echo. 说够了。

如果您需要一行,请使用&。例如,

echo Line 1 & echo. & echo line 3

将输出为:

Line 1

line 3

现在,说您想要一些更高级的东西,...

set n=^&echo.
echo hello %n% world

产出

hello
world

然后只要在%n%echo语句中需要换行时就抛出a 。这更接近于您\n使用的各种语言。

分解

set n=将变量设置为n等于:

^ 取消跟随的下一个符号:

&意味着在同一行上执行另一个命令。我们不在乎错误级别(它的回声语句会大声喊叫),因此&&不需要。

echo. 继续执行echo语句。

所有这些都是有效的,因为您实际上可以创建代码变量,并在其他命令中使用它们。它有点像贫民窟的功能,因为批处理并非完全是最高级的Shell脚本语言。这仅是因为批处理对变量的不良使用,而不是自然地在int,char,float,string等之间进行指定。

如果您很狡猾,则可以将其与其他事物配合使用。例如,使用它回显选项卡

set t=^&echo.     ::there are spaces up to the double colon

7
不要使用echo.它,因为它首先会尝试使用该名称查找文件。使用其他标点符号,例如echo,
恢复莫妮卡

20

回显某些内容以重定向到文件时,多个回显命令将不起作用。我认为也许“ >>”重定向器是一个不错的选择:

回声你好>临时
回声世界>>临时

8
第一个使用“>”的示例将创建一个新文件,第二个使用“ >>”的示例将附加到现有文件(如果尚不存在,则创建一个文件)。
扬·杜兰

1
(echo hello && echo world) > temp由Nathan J. Brauer在对(当前)已接受的答案作品的评论中提到。
GeroldBroser

15

就像Grimtron建议的一样-这是定义它的一个简单示例:

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

输出量

C:\>test.bat
hello
world

实际上,它将在“世界”之后呼应另外的换行符
BlueRaja-Danny Pflughoeft 2011年

1
@blue尾随换行符似乎是批处理文件本身的功能。如果重复该echo hello %newline%world行,则它们之间没有空格。
马特·威尔基2011年

2
echo "Hello %newline% world"失败,因为它在引号内。因为它不是真正的换行符。
jeb

14

如果需要将结果保存到文件中,可以使用

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

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 2014年

我认为我发现了一个错误:*字符

7

如果有人因为他们想从MINGW make makefile中回显空白行而来到这里,我曾经

@cmd /c echo.

简单地使用echo.会导致可怕的process_begin: CreateProcess(NULL, echo., ...) failed.错误消息。

我希望这可以帮助至少一个其他人:)


但这不是问题。下注!
Mesalcode

不知道是否讽刺:P
韦恩·浦田

通过在收件箱中查找来发现:D
Mesalcode,

3

如果需要在字符串文字中使用可以传递给变量的著名\ n,则可以像下面的Hello.bat脚本中那样编写代码:

@echo off
set input=%1
if defined input (
    set answer=Hi!\nWhy did you call me a %input%?
) else (
    set answer=Hi!\nHow are you?\nWe are friends, you know?\nYou can call me by name.
)

setlocal enableDelayedExpansion
set newline=^


rem Two empty lines above are essential
echo %answer:\n=!newline!%

这样,多行输出可以在一个位置准备,甚至在其他脚本或外部文件中也可以在另一位置打印。

换行符保存在换行符变量中。它的值必须被取代回声线扩展,所以我使用SETLOCAL enableDelayedExpansion使惊叹号标志其扩大执行变量。然后执行用换行符替换\ n(在帮助集上查找语法)。我们当然可以使用!newline!虽然设置答案,\ n更方便。它可以从外部传递(尝试Hello Hello R2 \ nD2),在这里没人知道持有换行符的变量的名称(是的,Hello C3!newline!P0 以相同的方式工作)。

上面的示例可以改进为子例程或独立批处理,例如call:mlecho Hi\nI'm your comuter

:mlecho
setlocal enableDelayedExpansion
set text=%*
set nl=^


echo %text:\n=!nl!%
goto:eof

请注意,附加的反斜杠不会阻止脚本解析\ n子字符串。


1
您基本上在做与上述Jeb答案相同的事情。
Squashman

我在上面阅读的答案非常有帮助,但是我需要调用一个脚本od子例程来解析\ n,所以我会避免在任何地方实现该技巧。这需要完善解决方案,我也分享了这一改进。希望它不会伤害任何动物。
Tomator

2

这对我有用,不需要延迟扩展:

@echo off
(
echo ^<html^> 
echo ^<body^>
echo Hello
echo ^</body^>
echo ^</html^>
)
pause

它这样写输出:

<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .

4
-1 echo asdf >myfile.txt将产生完全相同的结果。 echo在字符串末尾添加换行符。
BlueRaja-Danny Pflughoeft 2011年

2
很好的答案,他是唯一认识到对新行使用括号的价值的人。我相信这就是DOS的制造商希望您这样做的方式。
djangofan 2013年

2

要批量开始新行,只需添加“ echo [”,如下所示:

echo Hi!
echo[
echo Hello!

5
它很慢,并且在文件名为echo[.bat
jeb的

什么?它应该可以立即工作,并且只需删除echo [.bat文件。
PryroTech

2
它与echo几乎完全相同。句法。
PryroTech

5
是的,这echo.也是一个不好的解决方案。
jeb

1
从前面的答案中可以看出,这将尝试首先在路径上定位文件,这会导致文件变慢。同样适用于echo.。仅仅因为您的脚本需要换行符,让您的脚本用户希望删除其系统上的文件,这对我来说并不是一个好设计。
亚伯

2

Ken和Jeb解决方案效果很好。

但是新行仅使用LF字符生成,我需要CRLF字符(Windows版本)。

为此,在脚本末尾,我已将LF转换为CRLF。

例:

TYPE file.txt | FIND "" /V > file_win.txt
del file.txt
rename file_win.txt file.txt

0

您可以使用 @echo(@echo + [space] + [insecable space])

注意:不可分割的空间可以通过Alt + 0160获得

希望能帮助到你 :)

[编辑]嗯,您是对的,我在Makefile中需要它,它在其中完美运行。我想我的答案不适用于批处理文件...我的错。


ECHO ist eingeschaltet (ON).没有空线,尝试输入cmd提示
jeb

1
这是一个不间断的空间,而不是换行符。
Ry-

0

此解决方案有效(已测试):

type nul | more /e /p

这会将隔离的换行转换为回车换行组合。


但是,这如何在文本之间添加换行符?问题是关于echo hello \n world
jeb

拒绝我。这不是问题的答案
Mesalcode

-2

我不能比这更简单:

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.