【问题标题】:using batch echo with special characters使用带有特殊字符的批处理回显
【发布时间】:2011-11-10 15:16:36
【问题描述】:

这可能真的很容易,但网上没有答案。我想通过批处理将 XML 行回显到文件中,但它误解了用于重定向的 XML 结束标记“>”。该行如下:

echo <?xml version="1.0" encoding="utf-8" ?> > myfile.xml

有什么方法可以提示批处理解析器不要解释特殊字符串?我使用了双引号,但它也将它们写入文件!回显后文件应如下所示:

<?xml version="1.0" encoding="utf-8" ?>

【问题讨论】:

标签: batch-file cmd escaping echo


【解决方案1】:

您可以使用 ^ 转义 shell 元字符:

echo ^<?xml version="1.0" encoding="utf-8" ?^> > myfile.xml

请注意,由于 echo 是一个内置的 shell,它不遵循有关引用的通常约定,因此仅引用参数将输出引号而不是删除它们。

【讨论】:

  • @Nevin:你仍然必须逃避每一个&lt;&gt;。那里没什么特别的。话虽如此,我建议不要在一行中使用echoing 大型 XML 文件,原因很明显。
  • :很抱歉再次询问..它对我不起作用...代码如下。抱歉没有以正确的格式提供代码 echo ^ ^ ^ ^ ^ ^^> ^^> >MyFile.xml – Nevin Raj 1 小时前
  • @Nevin:里面有不应该存在的分号。除此之外,它为我生成了有效的 XML。
  • 你完全正确..分号引起了麻烦..谢谢
  • 不需要经常批处理,我总是忘记我的前 5 个非法 echo 字符:&lt;&gt;'()。所有都可以用插入符号^ 分隔。更多非法字符here,但大多数不在我的典型用例中。
【解决方案2】:

为了使用特殊字符,例如 Windows 上的带有 echo 的 '>',您需要在其前面放置一个特殊的转义字符。

例如

echo A->B

将无法工作,因为 '>' 必须被 '^' 转义:

 echo A-^>B

另见escape sequences

有一个简短的批处理文件,它打印一组基本的特殊字符及其转义序列。

【讨论】:

  • 但是对于引号,插入符号是转义字符,使用两个引号是错误的,因为它只是添加了第二个引号。 echo Line1"" &amp; echo line2echo Line1^" &amp; echo line2
  • 感谢您提供示例表。它帮助我处理了多个字符。
【解决方案3】:

另一种方法:

@echo off

for /f "useback delims=" %%_ in (%0) do (
  if "%%_"=="___ATAD___" set $=
  if defined $ echo(%%_
  if "%%_"=="___DATA___" set $=1
)
pause
goto :eof

___DATA___
<?xml version="1.0" encoding="utf-8" ?>
 <root>
   <data id="1">
      hello world
   </data>
 </root>
___ATAD___


rem # 
rem # 

【讨论】:

  • 好主意,在脚本中添加数据!
  • 从批处理文件中解压文本文件的好方法。 if defined $ echo(%%_ 行应扩展到 if defined $ echo(%%_ &gt;&gt; myxmlfile.xml 以将输出复制到文件中。
  • 我们可以在__DATA__ 中包含变量吗?
【解决方案4】:

一个简单的解决方案是使用延迟扩展,因为这不会更改任何特殊字符。

set "line=<?xml version="1.0" encoding="utf-8" ?>"
setlocal EnableDelayedExpansion
(
  echo !line!
) > myfile.xml

编辑:另一种解决方案是使用消失的报价

此技术使用引号来引用特殊字符

@echo off
setlocal EnableDelayedExpansion
set ""="
echo !"!<?xml version="1.0" encoding="utf-8" ?>

这个技巧很有效,因为在特殊字符阶段,!"! 中的前导引号将保留该行的其余部分(如果没有其他引号)。
而在延迟扩展阶段,!"! 将替换为变量" 的内容(单引号是合法名称!)。

如果您正在使用禁用的延迟扩展,则可以改用FOR /F 循环。

for /f %%^" in ("""") do echo(%%~" &lt;?xml version="1.0" encoding="utf-8" ?&gt;

但是看起来有点烦人,你也可以构建一个宏。

set "print=for /f %%^" in ("""") do echo(%%~""

%print%<?xml version="1.0" encoding="utf-8" ?>
%print% Special characters like &|<>^ works now without escaping

【讨论】:

  • 只要line 变量中没有!echo !line! 就可以工作。有什么补救措施吗?
  • 不,如果line 包含!,那么它将毫无问题地工作,但如何将感叹号放入变量中并不总是很明显。试试set "line=Hello^!" &amp; echo !line!
  • 你是 100% 正确的。我一定看过什么!
【解决方案5】:

输出&gt;字符的方法是在它前面加上^转义字符:

echo ^>

简单打印

>

【讨论】:

    【解决方案6】:

    乔伊的回答对我不起作用。 执行后

      echo ^<?xml version="1.0" encoding="utf-8" ?^> > myfile.xml
    

    我收到了这个错误 bash:意外标记 `>'

    附近的语法错误

    这个解决方案对我有用:

     echo "<?xml version=\"1.0\" encoding=\"utf-8\">" > myfile.txt
    

    另见http://www.robvanderwoude.com/escapechars.php

    【讨论】:

    • 请注意,这会保留输出中的引号
    【解决方案7】:

    这是使用SETFOR /F 的另一种方法

    @echo off
    
    set "var=<?xml version="1.0" encoding="utf-8" ?>"
    
    for /f "tokens=1* delims==" %%a in ('set var') do echo %%b
    

    你可以像这样美化它:

    @echo off
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    set "print{[=for /f "tokens=1* delims==" %%a in ('set " & set "]}=') do echo %%b"
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    
    
    set "xml_line.1=<?xml version="1.0" encoding="utf-8" ?>"
    set "xml_line.2=<root>"
    set "xml_line.3=</root>"
    
    %print{[% xml_line %]}%
    

    【讨论】:

      【解决方案8】:

      转义字符^ 也对我不起作用。 单引号对我有用(使用 ansible 脚本)

      shell: echo  '{{ jobid.content }}'
      

      输出:

       {
          "changed": true,
          "cmd": "echo  '<response status=\"success\" code=\"19\"><result><msg><line>query job enqueued with jobid 14447</line></msg><job>14447</job></result></response>'",
          "delta": "0:00:00.004943",
          "end": "2020-07-31 08:45:05.645672",
          "invocation": {
              "module_args": {
                  "_raw_params": "echo  '<response status=\"success\" code=\"19\"><result><msg><line>query job enqueued with jobid 14447</line></msg><job>14447</job></result></response>'",
                  "_uses_shell": true,
                  "argv": null,
                  "chdir": null,
                  "creates": null,
                  "executable": null,
                  "removes": null,
                  "stdin": null,
                  "stdin_add_newline": true,
                  "strip_empty_ends": true,
                  "warn": true
              }
          },
          "rc": 0,
          "start": "2020-07-31 08:45:05.640729",
          "stderr": "",
          "stderr_lines": [],
          "stdout": "<response status=\"success\" code=\"19\"><result><msg><line>query job enqueued with jobid 14447</line></msg><job>14447</job></result></response>",
          "stdout_lines": [
              "<response status=\"success\" code=\"19\"><result><msg><line>query job enqueued with jobid 14447</line></msg><job>14447</job></result></response>"
          ]
      

      【讨论】:

      • 问题是关于批处理/cmd。这肯定不会在批处理/cmd中工作。
      猜你喜欢
      • 2016-02-25
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-21
      • 1970-01-01
      相关资源
      最近更新 更多