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

我想做的事情是:

echo hello\nworld

这将输出:

hello
world

当前回答

这对我来说很有效,不需要延迟扩展:

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

它像这样写输出:

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

其他回答

这对我来说很有效,不需要延迟扩展:

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

它像这样写输出:

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

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

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

输出

C:\>test.bat
hello
world

在Ken的回答中添加一个变量,它显示了环境变量的设置值,其中包含新行。

我们使用此方法将错误条件附加到VAR中的字符串中,然后在所有错误检查输出的末尾将所有错误汇总到文件中。

这不是完整的代码,只是一个示例。

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
:: the two blank lines are required!
set NLM=^


set NL=^^^%NLM%%NLM%^%NLM%%NLM%
:: Example Usage:

Set ErrMsg=Start Reporting:
:: some logic here finds an error condition and appends the error report
set ErrMsg=!ErrMsg!!NL!Error Title1!NL!Description!NL!Summary!NL!

:: some logic here finds another error condition and appends the error report
set ErrMsg=!ErrMsg!!NL!Error Title2!NL!Description!NL!Summary!NL!

:: some logic here finds another error condition and appends the error report
set ErrMsg=!ErrMsg!!NL!Error Title3!NL!Description!NL!Summary!NL!

echo %ErrMsg%
pause
echo %ErrMsg% > MyLogFile.log

日志和屏幕输出看起来像这样…

要回显换行符,请添加一个点。就在回声之后:

echo.

经过一个不眠之夜,在阅读了这里所有的答案后,在阅读了大量的SS64 > CMD和大量的尝试和错误后,我发现:

(几乎)终极解决方案

博士TL;

... 对于早期采用者。

Important!
Use a text editor for C&P that supports Unicode, e.g. Notepad++!

设置换行环境变量…

... 在当前CMD会话中

Important!
Do not edit anything between '=' and '^'! (There's a character in between though you don't see it. Neither here nor in edit mode. C&P works here.)
:: Sets newline variables in the current CMD session
set \n=​^&echo:
set nl=​^&echo:

... 当前用户

Important!
Do not edit anything between (the second) '' and '^'! (There's a character in between though you don't see it. Neither here nor in edit mode. C&P works here.)
:: Sets newline variables for the current user [HKEY_CURRENT_USER\Environment]
setx \n ​^&echo:
setx nl ​^&echo:

... 对于本地机器

Important!
Do not edit anything between (the second) '' and '^'! (There's a character in between though you don't see it. Neither here nor in edit mode. C&P works here.)
:: Sets newline variables for the local machine [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]
setx \n ​^&echo: /m 
setx nl ​^&echo: /m 

为什么只是快?

它不适用于在同一打印行中没有配对(开引号和闭引号)的双引号,除非唯一未配对的双引号是文本的最后一个字符,例如:

works: ""echo %\n%...after "newline". Before "newline"...%\n%...after "newline" (paired in each printed line) works: echo %\n%...after newline. Before newline...%\n%...after newline" (the only unpaired double-quote is the last character) doesn't work: echo "%\n%...after newline. Before newline...%\n%...after newline" (double-quotes are not paired in the same printed line) Workaround for completely double-quoted texts (inspired by Windows batch: echo without new line): set BEGIN_QUOTE=echo ^| set /p !=""" ... %BEGIN_QUOTE% echo %\n%...after newline. Before newline...%\n%...after newline"

它适用于完全单引号的文本,如:

echo '%\n%...after newline. Before newline...%\n%...after newline'

附加值:转义字符

Note
There's a character after the '=' but you don't see it here but in edit mode. C&P works here.
:: Escape character - useful for color codes when 'echo'ing
:: See https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#text-formatting
set ESC=

颜色参见https://imgur.com/a/EuNXEar和https://gist.github.com/gerib/f2562474e7ca0d3cda600366ee4b8a45。

第二个附加价值:轻松获取Unicode字符

通过关键字获取87,461个Unicode字符(AToW)的绝佳页面:https://www.amp-what.com/。

的原因

The version in Ken's answer works apparently (I didn't try it), but is somehow...well...you see: set NLM=^ set NL=^^^%NLM%%NLM%^%NLM%%NLM% The version derived from user2605194's and user287293's answer (without anything between '=' and '^'): set nl=^&echo: set \n=^&echo: works partly but fails with the variable at the beginning of the line to be echoed: > echo %\n%Hello%\n%World! echo & echo:Hello & echo:World! echo is ON. Hello World due to the blank argument to the first echo. All others are more or less invoking three echos explicitely. I like short one-liners.

背后的故事

为了防止set \n=^&echo:在这里的回答中显示空白(并打印其状态),我第一次记住Alt+255用户是在Novell广泛使用网络和使用437和850等代码页的时候。但是0d255/0xFF在现在的Unicode中是大写的大写字母Y。

然后我想起来Unicode中有比普通的0d32/0x20更多的空格,但它们都被认为是空格,并导致与›␣相同的行为。

But there are even more: the zero width spaces and joiners which are not considered as whitespaces. The problem with them is, that you cannot C&P them since with their zero width there's nothing to select. So, I copied one that is close to one of them, the hair space (U+200A) which is right before the zero width space (U+200B) into Notepad++, opened its Hex-Editor plugin, found its bit representation E2 80 8A and changed it to E2 80 8B. Success! I had a non-whitespace character that's not visible in my \n environment variable.