如何从批处理文件输出中插入换行符?
我想做类似的事情:
echo hello\nworld
哪个会输出:
hello
world
echo Yes&echo No
如何从批处理文件输出中插入换行符?
我想做类似的事情:
echo hello\nworld
哪个会输出:
hello
world
echo Yes&echo No
Answers:
echo hello & echo.world
这意味着您可以& echo.
为换行符定义一个常量\n
。
echo. && echo hello && echo. && echo world
$ (echo Hello && echo World) > ./File.txt
采用:
echo hello
echo.
echo world
echo "Makefile contents (which has \n)" > Makefile
带有多个回显来生成Makefile ,这是行不通的
(echo hello & echo world) >> ./test.txt
echo line 1 > Makefile
然后echo line 2 >> Makefile
。使用>>
cause会将输出附加到文件,这恰恰是这种情况下所需的行为。
在这里,创建一个.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语句之间的代码。
set nl=^&echo.
,则echo hello %nl% world
产生相同的效果。
echo:
cmd / bat文件中有一个标准功能可以写入空白行,它可以在cmd输出中模拟新行:
@echo off
@echo line1
@echo:
@echo line2
以上cmd文件引用的输出:
line1
line2
echo(
。看起来可能会引起问题,但实际上效果很好。所有其他形式至少有一种情况,该命令将无法按预期执行。
ECHO(
失败的场景。
echo
,它们的作用是什么”的思路?
就像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:
,因为它们可能真的很慢,具体取决于脚本执行的位置(例如网络驱动器)。
call :pause line1!\n!line2
,以开头该子例程并以该子例程setlocal EnableDelayedExpansion
结束,setlocal DisableDelayedExpansion
以防止过早地解释换行符。
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
然后只要在%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
echo.
它,因为它首先会尝试使用该名称查找文件。使用其他标点符号,例如echo,
回显某些内容以重定向到文件时,多个回显命令将不起作用。我认为也许“ >>”重定向器是一个不错的选择:
回声你好>临时 回声世界>>临时
(echo hello && echo world) > temp
由Nathan J. Brauer在对(当前)已接受的答案作品的评论中提到。
就像Grimtron建议的一样-这是定义它的一个简单示例:
@echo off
set newline=^& echo.
echo hello %newline%world
C:\>test.bat
hello
world
echo hello %newline%world
行,则它们之间没有空格。
echo "Hello %newline% world"
失败,因为它在引号内。因为它不是真正的换行符。
你也可以这样
(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., ...) failed.
错误消息。
我希望这可以帮助至少一个其他人:)
如果需要在字符串文字中使用可以传递给变量的著名\ 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子字符串。
这对我有用,不需要延迟扩展:
@echo off
(
echo ^<html^>
echo ^<body^>
echo Hello
echo ^</body^>
echo ^</html^>
)
pause
它这样写输出:
<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .
echo asdf >myfile.txt
将产生完全相同的结果。 echo
在字符串末尾添加换行符。