使用带有特殊字符的批处理回显

Posted

技术标签:

【中文标题】使用带有特殊字符的批处理回显【英文标题】: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" ?>

【问题讨论】:

Escape angle brackets in a Windows command prompt 的可能重复项 Batch character escaping的可能重复 Escape angle brackets in a Windows command prompt的可能重复 【参考方案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中工作。

以上是关于使用带有特殊字符的批处理回显的主要内容,如果未能解决你的问题,请参考以下文章

从 MySQL 数据库中获取带有特殊字母的字符串

如何在 PHP“回声”中插入带有撇号和其他特殊字符的文本? [复制]

回显特殊字符时,Mysql 行导入停止

如何在批处理文件中获取带有特殊字符的子字符串?

Hibernate 和 Spring Data JPA 无法处理带有特殊字符的 Oracle 表名?

batBat 中特殊符号