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

Bri*_*ndy 605 windows newline batch-file

你怎么能从批处理文件输出中插入换行符?

我想做的事情如下:

echo hello\nworld
Run Code Online (Sandbox Code Playgroud)

哪个会输出:

hello
world
Run Code Online (Sandbox Code Playgroud)

Mat*_*cey 531

使用:

echo hello
echo.
echo world
Run Code Online (Sandbox Code Playgroud)

  • 是否可以在单个echo语句中提供字符串? (12认同)
  • 为什么需要使用单个echo语句来完成它; 拥有另一个人的危害在哪里?我假设你不是简单地为它的乐趣添加不必要的约束...... (5认同)
  • 对于文件的多行输出,为什么不只是执行以下操作?`echo line 1> Makefile`然后`echo line 2 >> Makefile`.使用`>>`会将输出附加到文件中,这正是此情况所需的行为. (4认同)
  • @Rob,我刚遇到这个问题而且这些都没有.您需要在我的示例中以单个语句回显.我正在从HTML生成一些tex文件,并使用`echo'生成文件内容(有\n)"> Makefile`生成一个Makefile.有多个回声,它不起作用 (3认同)
  • 使用&(或&&)在单个语句中执行它们:例如,将"hello \nworld"放在txt文件中:`(echo hello&echo world)>>./ test.txt` (3认同)
  • `echo:` 是 [SS64](https://ss64.com/nt/echo.html) 推荐的。 (3认同)
  • @Rob,你不能回答Brian R,Bondy 的问题吗?他不要求其他方法 (2认同)

Gri*_*ron 440

echo hello & echo.world

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

  • @Shahbaz - `$(echo Hello && echo world)> ./ File.txt` (45认同)
  • 该示例不需要句点,但您需要一个空白空行:`echo.&& echo hello && echo.&& echo world` (42认同)
  • "回声"中的时期事物.永远不会让我惊讶.它已经过时了,我仍然总是忘记点必须与命令名严格连接,两者之间没有空格.在你的帖子中没有错误,我写这个只是提醒:"回声." !="回声." ! (24认同)
  • 也可以没有句号工作:echo hello && echo world (13认同)
  • 你能用一个回声做到这一点,以便可以重定向到一个文件吗? (4认同)
  • @quetzalcoatl,它变得更加陌生.除了点之外的其他字符也可以.SS64说更好的语法是[`echo(`)(http://ss64.com/nt/echo.html)以提高性能(仍然没有空间让你介意).扩展讨论其他角色及其优点/缺点在[ ECHO.未提供文字或空白栏 - 而是使用ECHO /](http://www.dostips.com/forum/viewtopic.php?t=774) (4认同)
  • @NathanJ.Brauer,这个命令/CMD (Dos/Windows) 不是 bash 等。分号只是另一个字符,没有任何效果。 (3认同)
  • 缺少最终答案:$ echo.>> myfile.txt这将在文件中添加换行符 (2认同)

小智 135

在这里,创建一个.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
Run Code Online (Sandbox Code Playgroud)

您应该看到如下输出:

There should be a newline
inserted here.

Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)

显然,您只需要REM语句之间的代码.

  • 这是一个很好的例子,表明cmd.exe和Windows批处理文件完全是疯了! (80认同)
  • 非常令人印象深刻,你能花些时间来解释线路如何设置NL = ^^^%NLM %% NLM%^%NLM %% NLM%有效吗?我不能完全理解它 (50认同)
  • SELF注意:"设置NLM = ^"**行必须**在CARET之后没有任何内容,**必须**之后有2个空白行. (12认同)
  • @andy提到了一条+8评论保证一个问题:http://stackoverflow.com/questions/6379619/explain-how-dos-batch-newline-variable-hack-works (8认同)
  • 有关更简单的方法,请参阅我的答案.`set nl = ^&echo.,然后`echo hello%nl%world`产生相同的效果. (3认同)

mac*_*pas 94

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

@echo off
@echo line1
@echo:
@echo line2
Run Code Online (Sandbox Code Playgroud)

上面引用的cmd文件的输出:

line1

line2
Run Code Online (Sandbox Code Playgroud)

  • 事实上,任何UNUSED特殊字符都应该起作用.我总是鼓励使用/,因为斜杠是命令选项的标准char.此外,我总是批评使用微软中的某人不幸选择的点,因为命令:echo.com根据MS-DOS/Windows Batch命令处理器的版本给出不同的结果. (37认同)
  • 唯一可行的版本是`echo(`.看起来它可能会导致问题,但它实际上是完美的.所有其他形式至少有一种情况,命令将无法按预期执行. (18认同)
  • @naxa - 没有任何官方的,只是由几批黑客派生的集体知识.目标是拥有可用于ECHO任何值的语法,包括任何值,并且永远不必担心获得除预期之外的任何其他值.我所知道的最佳摘要是http://www.dostips.com/forum/viewtopic.php?p=4554#p4554.它会让你感到茫然,但是没有人想出过`ECHO(`失败)的场景. (3认同)
  • @Pacerier:尝试`echo=/?` 和`echo,/?`,你会发现它们都失败了(因为它们_not_ 显示“/?”)。在其余三个中,`echo\/?` 在其他语言中看起来像是一个“escape”,而 `echo:/?` 可能会被误认为是标签或驱动器。看起来“更标准”的形式是`echo//?`_精确_因为`/`用于命令选项! (2认同)
  • @Pacerier - 每个建议都有失败的例子.请仔细阅读http://www.dostips.com/forum/viewtopic.php?p=4554#p4554. (2认同)
  • @Pacerier在这里有足够的_echo_来回答一个独立的问题。也许类似“什么字符可以立即跟随`echo`,以及它们的作用是什么?” (2认同)

jeb*_*jeb 61

喜欢Ken的答案,但是使用了延迟扩展.

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

echo Line1!\n!Line2
echo Works also with quotes "!\n!line2"
Run Code Online (Sandbox Code Playgroud)

首先创建一个换行符并将其分配给\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=
Run Code Online (Sandbox Code Playgroud)

但是使用的echo.,echo\echo:应该避免,因为他们可以很慢,这取决于该脚本将被执行,就像一个网络驱动器的位置.

  • 如果您将带换行符的字符串作为参数传递给批处理子程序,例如`call :pause line1!\n!line2`,请使用`setlocal EnableDelayedExpansion` 启动子程序并以`setlocal DisableDelayedExpansion` 结束以保留换行符以免被过早解释。 (2认同)
  • +1 用于角色 `echo,` `echo;` `echo(` `echo/` `echo+` `echo=` 和流氓画廊 `echo。` ``echo\`` `echo:`。现在如果你要解释为什么这些工作真见鬼,我欠你一杯免费啤酒。 (2认同)

col*_*non 37

echo. 说够了.

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

echo Line 1 & echo. & echo line 3
Run Code Online (Sandbox Code Playgroud)

将输出为:

Line 1

line 3
Run Code Online (Sandbox Code Playgroud)

现在,假设你想要更有趣的东西,......

set n=^&echo.
echo hello %n% world
Run Code Online (Sandbox Code Playgroud)

输出

hello
world
Run Code Online (Sandbox Code Playgroud)

然后只需在%n%echo语句中想要一个新行时抛出一个.这更接近您\n在各种语言中使用.

分解

set n=将变量设置n为:

^ 取消下一个符号:

&意味着在同一行上执行另一个命令.我们不关心errorlevel(它是一个大声喊叫的echo语句),所以&&不需要.

echo. 继续回声.

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

如果你很狡猾,你可以让它与其他东西一起工作.例如,使用它来回显选项卡

set t=^&echo.     ::there are spaces up to the double colon
Run Code Online (Sandbox Code Playgroud)

  • **不要**使用`echo`,因为它首先尝试按该名称查找文件.使用其他标点符号,例如`echo,` (4认同)

Cre*_*ing 19

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

echo hello > temp
echo world >> temp

  • 第一个例子,使用">",将创建一个新文件,第二个例子,使用">>",将附加到现有文件(或创建它,如果它尚不存在). (8认同)

小智 15

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

@echo off
set newline=^& echo.
echo hello %newline%world
Run Code Online (Sandbox Code Playgroud)

产量

C:\>test.bat
hello
world
Run Code Online (Sandbox Code Playgroud)

  • `echo"Hello%newline%world"`失败,因为它在引号内.因为它不是_real_换行符. (2认同)

tes*_*t30 14

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

(echo a & echo. & echo b) > file_containing_multiple_lines.txt
Run Code Online (Sandbox Code Playgroud)


alb*_*ert 9

你也可以这样做,

(for %i in (a b "c d") do @echo %~i)
Run Code Online (Sandbox Code Playgroud)

输出将是,

a
b
c d
Run Code Online (Sandbox Code Playgroud)

请注意,当将其放入批处理文件中时,'%'应加倍.

(for %%i in (a b "c d") do @echo %%~i)
Run Code Online (Sandbox Code Playgroud)


Way*_*oda 6

如果有人来这里因为他们想要从MINGW make makefile回显一个空白行,我就用了

@cmd /c echo.

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

我希望这有助于至少有一个人在那里:)


Tal*_*ues 6

对于echo换行符,.在 后面添加一个点echo

echo.
Run Code Online (Sandbox Code Playgroud)

  • 添加 15 年前问题的答案应该包含任何新内容,但您的答案之前已经在这里给出过多次。顺便提一句。`echo.` 不是一个好的答案,因为它有缺点 (4认同)

归档时间:

查看次数:

926138 次

最近记录:

6 年,2 月 前