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

时间:2008-09-25 11:50:25

标签: batch-file newline

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

我想做类似的事情:

echo hello\nworld

哪个会输出:

hello
world

22 个答案:

答案 0 :(得分:506)

使用:

echo hello
echo.
echo world

答案 1 :(得分:427)

echo hello & echo.world

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

答案 2 :(得分:126)

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

答案 3 :(得分:93)

cmd / bat-files中有一个标准功能echo:来写空行,它在cmd输出中模拟一个新行:

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

上述cmd文件的输出:

line1

line2

答案 4 :(得分:59)

像肯的答案,但使用延迟扩展。

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:Long commands split over multiple lines in Vista/DOS batch (.bat) file
SO:How does the Windows Command Interpreter (CMD.EXE) parse scripts?

修改:避免echo.

这不回答问题,因为问题是关于可以输出多行的单echo

但是,尽管其他答案建议使用echo.创建一个新行,但应该注意echo.是最差的,因为它非常慢并且它可以完全失败,如cmd .exe搜索名为ECHO的文件并尝试启动它。

只打印一个空行,您可以使用

之一
echo,
echo;
echo(
echo/
echo+
echo=

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

答案 5 :(得分:37)

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设置为:

^取消下一个符号:

&表示在同一行上执行另一个命令。我们不关心errorlevel(它是一个大声喊叫的echo语句),因此不需要&&

echo.继续使用echo语句。

所有这一切都有效,因为您实际上可以创建代码变量,并在其他命令中使用它们。它有点像贫民窟功能,因为批处理并不是最先进的shell脚本语言。这只能起作用,因为批处理的变量使用不当,而不是在int,chars,浮点数,字符串等之间自然指定。

如果你很狡猾,你可以让它与其他东西一起工作。例如,使用它来回显标签

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

答案 6 :(得分:19)

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

echo hello > temp
echo world >> temp

答案 7 :(得分:15)

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

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

输出

C:\>test.bat
hello
world

答案 8 :(得分:13)

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

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

答案 9 :(得分: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)

答案 10 :(得分:6)

如果有人来这里是因为他们希望从MINGW make makefile中回显一个空行,我用了

@cmd /c echo.

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

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

答案 11 :(得分:3)

要批量开始新行,您所要做的就是添加“echo [”,如下所示:

echo Hi!
echo[
echo Hello!

答案 12 :(得分:2)

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

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

它写出这样的输出:

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

答案 13 :(得分: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

答案 14 :(得分:2)

如果需要在可以传递给变量的字符串文字中使用着名的\ 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!%

这种方式多行输出可以在一个地方准备,甚至在其他scritpt或外部文件中,并打印在另一个地方。

换行符保存在换行符变量中。在 echo 行展开之后,必须将其值替换为,因此我使用 setlocal enableDelayedExpansion 来启用感叹号,这些符号会在执行时扩展变量。执行将 \ n 替换为换行符内容(在帮助集中查找语法)。我们当然可以在设置答案时使用!newline!,但 \ n 更方便。它可以从外部传递(尝试 Hello R2 \ nD2 ),其中没有人知道持有换行符的变量的名称(是的, Hello C3!换行符!P0 是有效的同样的方式)。

以上示例可以细化为子例程或独立批处理,使用方式如call:mlecho Hi\nI'm your comuter

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


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

请注意,额外的反斜杠不会阻止脚本解析\ n substring。

答案 15 :(得分:2)

对于带有 virtual terminal sequences 的 Windows 10,存在高度控制光标位置的方法。

要定义转义序列 0x1b,可以使用以下内容:

@Echo off
 For /f %%a in ('echo prompt $E^| cmd')Do set \E=%%a

在字符串之间输出单个换行符:

<nul set /p "=Hello%\E%[EWorld"

要输出 n 换行符,其中 n 被替换为整数:

<nul set /p "=%\E%[nE"

很多

答案 16 :(得分:1)

简单

set nl=.
echo hello
echo%nl%
REM without space ^^^
echo World

结果:

hello
world

答案 17 :(得分:0)

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

注意:可以使用Alt + 0160

获取不可用空间

希望有所帮助:)

[编辑]嗯,你是对的,我在Makefile中需要它,它在那里完美运行。我想我的答案不适合批处理文件...我的不好。

答案 18 :(得分:0)

为什么不对echo;使用子串/替换空间?

set "_line=hello world"
echo\%_line: =&echo;%
  • 结果:
hello
world
  • 或者,将\ n替换为echo;
set "_line=hello\nworld"
echo\%_line:\n=&echo;%

答案 19 :(得分:-1)

我无法做到比:

更简单
echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat

答案 20 :(得分:-3)

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

type nul | more /e /p

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

答案 21 :(得分:-4)

在Linux系统中,最字符保守的方法是使用-e别名-解释反斜杠的转义字符。

echo -e "hello\nworld"

这里还有其他examples