【问题标题】:Why CMD escape character does magic instead of escaping new line为什么 CMD 转义字符会变魔术而不是转义新行
【发布时间】:2016-02-10 07:50:41
【问题描述】:

我尝试执行简单的脚本:

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

echo %list%

输出是

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

虽然我预计它是“a”、“b”、c。 引号似乎破坏了一切,因为如果 b 没有它们,一切正常。我也很奇怪为什么它只在第二次换行时才中断。

那么,为什么输出如此奇怪? 如果重要,我尝试在 Windows 7 上启动脚本

【问题讨论】:

  • 奇数 - 在我的机器上,同样使用 Win7,它将 list 设置为 "a","b",^ 并尝试执行 c。由于list 终止^echo 产生"a","b",,后跟echo 之后的行的内容...
  • @Magoo 你知道为什么它将列表设置为“a”,“b”,^吗?为什么它不像第一个那样将第二个 ^ 视为转义字符?在我的机器上,如果 set 后面没有 echo(或者至少它是冗长的),它会尝试执行 c,而且我不知道在这种情况下它的行为也不同。

标签: windows batch-file cmd


【解决方案1】:

有趣的问题!似乎当^ 放在行尾时,下一行的第一个字符 没有 被解析,而是直接插入到结果中 没有 被解析器。如果这样的字符必须是平衡的(如引号或括号),那么这会导致奇怪的“错误”,否则会与“不平衡的字符”相关联。

如果您更改第一个字符。在^ 之后的行中,问题消失了。例如插入空格:

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

...或移动逗号:

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

...或者只是删除引用(正如您已经测试过的那样)。

【讨论】:

    【解决方案2】:

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

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

    为了避免字符转义,您可以使用重定向(显然)。

    set list="a",<nul ^
    "b",^
    c
    
    echo %list%
    

    更多关于插入符号和多行行为SO:Long commands split over multiple lines..

    关于Dostips:Comments without increasing macro size的多行插入符号的重定向效果

    【讨论】:

      猜你喜欢
      • 2016-03-30
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多