windows echo空行 - 你怎么能在批处理文件中回显一个换行符?




bat (15)

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

我想要做一些事情:

> echo hello\nworld

哪个会输出:

你好
世界


Answers

就像Grimtron所建议的那样 - 下面是一个快速定义它的例子:

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

产量

C:\>test.bat
hello
world

像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:应该避免,因为它们可能非常慢,具体取决于脚本将执行的位置,如网络驱动器。


echo hello & echo.world

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


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

注意:可以用Alt + 0160获得可放置的空间

希望能帮助到你 :)

嗯,你是对的,我需要它在一个Makefile中,它在那里完美的工作。 我想我的答案不适合批处理文件...我的坏。


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


如果需要在可以传递给变量的字符串文字中使用着名的\ 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 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 [”,如下所示:

echo Hi!
echo[
echo Hello!

如果你需要把结果放到一个文件中,你可以使用

(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)

我不能说比以下更简单:

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat

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

echo hello > temp
echo world >> temp

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

@cmd /c echo.

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

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


有一个标准的特征echo:在cmd / bat-files中写空行,它在你的cmd输出中模拟一个新行:

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

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

line1

line2

在所有答案中,对于上述问题,这是最好的答案:

 mysql> use db_name;
 mysql> source file_name.sql;






windows batch-file command-line dos