我想要做这样的事情:
echo hello\nworld
将输出:
hello
world
echo hello\nworld
将输出:
hello
world
如果有人来到这里是因为想要在MINGW make makefile中回显一个空行,我使用了
@cmd /c echo.
仅使用echo.
会导致可怕的process_begin: CreateProcess(NULL, echo., ...) failed.
错误消息。
我希望这能帮助至少另外一个人 :)
echo
后面添加一个点.
:echo.
经过一夜的不眠和阅读此处的所有答案,阅读了大量SS64 > CMD并尝试了很多次错误后,我找到了:
... 对于早期采用者。
重要! |
---|
使用支持Unicode的文本编辑器进行复制和粘贴,例如Notepad++! |
重要! |
---|
不要编辑“= ”和“^”之间的任何内容!(虽然这两个符号之间有一个字符,但您看不到它。无论是在这里还是在编辑模式中都是如此。在这里进行复制和粘贴是可以工作的。) |
:: Sets newline variables in the current CMD session
set \n=^&echo(
set nl=^&echo(
重要提示! |
---|
不要编辑(第二个)'␣ '和'^ '之间的任何内容!(虽然这两个字符之间有一个字符,但您在此处或编辑模式下都看不到它。复制和粘贴在此处有效。) |
:: Sets newline variables for the current user [HKEY_CURRENT_USER\Environment]
setx \n ^&echo(
setx nl ^&echo(
重要提示! |
---|
不要编辑位于(第二个)'␣ '和'^ '之间的任何内容!(尽管中间有一个字符,但您无法看到它。无论在此处还是在编辑模式下都是如此。在此处可以使用复制和粘贴功能。) |
:: 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'
注意事项 |
---|
在“= ”后面有一个字符,但在此处看不到,只有在编辑模式下才能看到。复制和粘贴在这里有效。 |
:: 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。
一个很好的页面,可以通过关键词(AToW)获取87,461个Unicode字符: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 echo
ed:
> 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 echo
s explicitely.
I like short one-liners.
为了防止在此处提供的答案中建议使用set \n=^&echo:
时出现空白(并打印其状态),我首先想起了那些使用437和850等代码页面的Novell网络时代的Alt+255用户。但是0d255 / 0xFF现在在Unicode中是›Ÿ‹(带分音符的拉丁小写字母Y)。
然后我记得Unicode中有更多的空格,而不仅仅是普通的0d32 / 0x20,但它们都被视为空格,并导致与›␣‹相同的行为。
但还有更多:零宽度空格和连接符不被视为空格。它们的问题在于,由于它们的零宽度,您无法复制和粘贴它们,因为没有内容可以选中。所以,我复制了一个接近它们之一的"hair space"(U+200A),它位于"zero width space"(U+200B)之前,然后打开了Notepad++的Hex-Editor插件,找到了它的位表示E2 80 8A
并把它改为E2 80 8B
。成功了!我得到了一个不在我的\n
环境变量中可见的非空格字符。
437
上,这行代码:echo Hello%\n%world
将会输出HelloΓÇï
<换行>World
,但是当执行chcp 65001
时就可以正常工作。 - Gerhardset \n=^&echo:
只是一个弱的技巧,它并不是换行符的定义。或者尝试 set multiline=Line1%\n%Line2
然后 echo ### !multiline!
。应该使用Ken的答案或其延迟扩展变体。 - jebKen and Jeb solutions的表现不错。
但是新行只生成LF字符,我需要CRLF字符(Windows版本)。
因此,在脚本结束时,我将LF转换为CRLF。
示例:
TYPE file.txt | FIND "" /V > file_win.txt
del file.txt
rename file_win.txt file.txt
@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!%
这样,多行输出可以在一个地方进行准备,甚至可以在其他脚本或外部文件中进行,然后在另一个地方打印出来。
换行符保存在newline变量中。它的值必须在echo行扩展之后进行替换,因此我使用setlocal enableDelayedExpansion来启用感叹号符号,以便在执行时扩展变量。执行将\n替换为newline内容(请查看help set中的语法)。当然,我们可以在设置answer时使用!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
set ex=!
setlocal enableDelayedExpansion
echo shout!ex!
- Tomator要在批处理中开始新行,您只需添加"echo["即可:
echo Hi!
echo[
echo Hello!
echo[.bat
命名的文件时,它会运行缓慢且失败。 - jebecho.
也是如此。期望用户删除其系统上的文件,仅因为您的脚本需要一个换行符,这听起来对我来说并不是一个好的设计。 - Abel序列 | 代码 | 描述 | 行为 |
---|---|---|---|
ESC [ <n> E | CNL | 光标下移一行 | 从当前位置向下移动<n>行 |
CR
的CRLF
),并且之前打印的行将被从其开头覆盖。对于具备 虚拟终端序列 的 Windows 10,存在一种可以高度控制光标位置的方法。
要定义转义序列 0x1b,可以使用以下内容:
@Echo off
For /f %%a in ('echo prompt $E^| cmd')Do set \E=%%a
在字符串之间输出单个换行:
<nul set /p "=Hello%\E%[EWorld"
n
个换行符,其中 n
是一个整数:<nul set /p "=%\E%[nE"
ESC [ <n> E
(光标下移n行)只有在未到达控制台窗口底部时才有效。 - Gerold Broserecho;
?set "_line=hello world"
echo\%_line: =&echo;%
hello
world
echo;
set "_line=hello\nworld"
echo\%_line:\n=&echo;%
14年后,我建议使用PowerShell。
你甚至很可能只需要将文件扩展名从.bat
改为.ps1
就可以让它正常工作。
然后,你可以使用:
echo "Hello`nWorld"
# or even
echo Hello`nWorld
在Win10上测试通过。
您也可以使用echo "Hello`r`nWorld"
来生成Windows类型的换行符。
来源:https://devblogs.microsoft.com/scripting/powertip-new-lines-with-powershell/,它说“使用 `n 字符”。
echo
在Windows和Linux上都可用。对于Linux,您可以简单地使用echo "Hello\nWorld"
在大多数发行版上获得相同的结果。printf
。