题
如何从批处理文件输出中插入换行符?
我想做类似的事情:
echo hello\nworld
哪个会输出:
hello
world
解决方案
echo hello& echo.world 代码>
这意味着您可以定义& echo。
作为换行符的常量 \ n
。
其他提示
使用:
echo hello
echo.
echo world
在这里,创建一个.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语句之间的代码。
cmd / bat-files中有一个标准功能 echo:
来写空行,它在cmd输出中模拟一个新行:
@echo off
@echo line1
@echo:
@echo line2
上述cmd文件的输出:
line1
line2
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:
,因为它们可能非常慢,具体取决于执行脚本的位置,如网络驱动器。
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
设置为:
^
取消下一个要遵循的符号:
&amp;
表示在同一行上执行另一个命令。我们不关心errorlevel(它是一个大声喊叫的echo语句),所以不需要&amp;&amp;
。
echo。
继续使用echo语句。
所有这一切都有效,因为您实际上可以创建代码变量,并在其他命令中使用它们。它有点像贫民窟功能,因为批处理并不是最先进的shell脚本语言。这只能起作用,因为批处理的变量使用不当,而不是在int,chars,浮点数,字符串等之间自然指定。
如果你很狡猾,你可以让它与其他东西一起工作。例如,使用它来回显标签
set t=^&echo. ::there are spaces up to the double colon
当回显某些内容以重定向到文件时,多个echo命令将不起作用。我想也许是“&gt;&gt;”重定向器是一个不错的选择:
echo hello > temp echo world >> temp
就像Grimtron建议的那样 - 这里有一个快速的例子来定义它:
@echo off
set newline=^& echo.
echo hello %newline%world
输出
C:\>test.bat
hello
world
如果您需要将结果放入文件,可以使用
(echo a & echo. & echo b) > file_containing_multiple_lines.txt
您也可以这样做,
(for %i in (a b "c d") do @echo %~i)
输出将是,
a
b
c d
请注意,当将其放入批处理文件中时,'%'应加倍。
(for %%i in (a b "c d") do @echo %%~i)
如果有人来这里是因为他们希望从MINGW make makefile中回显一个空行,我用
@cmd / c echo。
只需使用 echo。
会导致可怕的 process_begin:CreateProcess(NULL,echo。,...)失败。
错误消息。
我希望这至少可以帮助其他人:)
要批量开始新行,您所要做的就是添加“echo [&quot;”,如下所示:
echo Hi!
echo[
echo Hello!
这对我有用,不需要延迟扩展:
@echo off
(
echo ^<html^>
echo ^<body^>
echo Hello
echo ^</body^>
echo ^</html^>
)
pause
它写出这样的输出:
<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .
Ken和Jeb解决方案运作良好。
但新行仅使用LF字符生成,我需要CRLF字符(Windows版本)。
为此,在脚本结束时,我已将LF转换为CRLF。
示例:
TYPE file.txt | FIND "" /V > file_win.txt
del file.txt
rename file_win.txt file.txt
如果需要在可以传递给变量的字符串文字中使用着名的\ 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 是有效的同样的方式)。
以上示例可以细化为子程序或独立批处理,像调用一样使用:mlecho你好\ n我是你的计算机
:
:mlecho
setlocal enableDelayedExpansion
set text=%*
set nl=^
echo %text:\n=!nl!%
goto:eof
请注意,额外的反斜杠不会阻止脚本解析\ n substring。
你可以使用 @echo
(@ echo + [space] + [insecable space])
注意:可以使用Alt + 0160
获取不可用空间希望有所帮助:)
[编辑]嗯,你是对的,我在Makefile中需要它,它在那里完美运行。我想我的答案不适合批处理文件...我的不好。
我不能比它更简单:
echo echo hello^&echo world^&pause>silly.bat
call silly.bat