为什么CMD转义字符会产生神奇的效果而不是转义换行符

3
我将尝试执行一个简单的脚本:

我尝试执行一个简单的脚本:

set list="a",^
"b",^
c

echo %list%

输出结果为:

"a","b",a","b",^

虽然我期望它是 "a","b",c。但由于引号的问题,一切都被破坏了。如果 b 没有引号,一切都可以正常工作。对我来说,它为什么只在第二个新行转义时中断也很神秘。

那么,输出为什么如此奇怪呢?如果有影响的话,我尝试在 Windows 7 上运行脚本。


2
奇怪 - 在我的电脑上,也是使用Win7,它将list设置为"a","b",^并尝试执行c。由于list终止了^,因此echo会产生"a","b",后跟echo后面一行的内容... - Magoo
@Magoo,你知道为什么它将列表设置为"a","b",^吗?为什么它不像第一个一样将第二个^视为转义字符呢?在我的机器上,如果set后面没有跟随echo(或者至少会详细说明),它会尝试执行c,我不知道为什么它的行为在这种情况下也不同。 - EGeorge
2个回答

2
有趣的问题!当“^”放置在行末时,下一行的第一个字符并没有被解析,而是直接插入结果中,而不经过解析器处理。如果这样的字符必须是平衡的(如引号或括号),那么这将导致奇怪的“错误”,否则会与“不平衡字符”相关联。
如果您更改“^”后面一行的第一个字符,则问题将消失。例如,插入一个空格:
set list="a",^
 "b",^
 c

...或者移动逗号:

set list="a"^
,"b"^
,c

...或者只需删除引号(因为您已经测试过)。


1
正如Aacini所说,多行插入符会删除第一个换行符并转义下一个字符。这经常用于创建包含换行符的变量。
set LF=^


REM Two empty lines here creates a line feed in LF.

为避免字符转义,你可以使用重定向(显然)。
set list="a",<nul ^
"b",^
c

echo %list%

了解插入符号和多行行为的更多信息,请参见SO:长命令跨多行拆分..

关于重定向对多行插入符号的影响,请参见Dostips:不增加宏大小的注释


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接