如何从批处理文件输出中插入换行符?
我想做的事情是:
echo hello\nworld
这将输出:
hello
world
如何从批处理文件输出中插入换行符?
我想做的事情是:
echo hello\nworld
这将输出:
hello
world
当前回答
可以使用@echo (@echo +[空间]+[不安全空间])
注:不安全空间可用Alt+0160获取
希望能有所帮助。
嗯,你是对的,我需要它在一个Makefile中,它在那里工作得很好。我想我的答案不适合批处理文件…我的坏。
其他回答
如果你需要把结果放到一个文件中,你可以使用:
(echo a & echo: & echo b) > file_containing_multiple_lines.txt
Echo hello & Echo .world
这意味着您可以定义& echo。作为换行符的常数\n。
的回声。足够的说。
如果需要在单行中使用&。例如,
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等于:
^取消后面的下一个符号:
&表示在同一行上执行另一个命令。我们不关心errorlevel(这是一个echo语句),所以不需要&&。
的回声。继续echo语句。
所有这些都是可行的,因为您实际上可以创建代码变量,并在其他命令中使用它们。它有点像贫民区函数,因为批处理并不是最先进的shell脚本语言。这只是因为批处理对变量的使用很差,没有在int、char、float、字符串等之间自然地进行指定。
如果你很狡猾,你可以让它和其他东西一起工作。例如,使用它来回显一个制表符
set t=^&echo. ::there are spaces up to the double colon
要回显换行符,请添加一个点。就在回声之后:
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.