使用带有特殊字符的批处理回显
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:你仍然必须逃避每一个<
和>
。那里没什么特别的。话虽如此,我建议不要在一行中使用echo
ing 大型 XML 文件,原因很明显。
:很抱歉再次询问..它对我不起作用...代码如下。抱歉没有以正确的格式提供代码 echo ^ ^echo
字符:<
、>
、'
、(
和 )
。所有都可以用插入符号^
分隔。更多非法字符here,但大多数不在我的典型用例中。【参考方案2】:
为了使用特殊字符,例如 Windows 上的带有 echo 的 '>',您需要在其前面放置一个特殊的转义字符。
例如
echo A->B
将无法工作,因为 '>' 必须被 '^' 转义:
echo A-^>B
另见escape sequences。
有一个简短的批处理文件,它打印一组基本的特殊字符及其转义序列。
【讨论】:
但是对于引号,插入符号是转义字符,使用两个引号是错误的,因为它只是添加了第二个引号。echo Line1"" & echo line2
与 echo Line1^" & 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(%%_ >> 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(%%~" <?xml version="1.0" encoding="utf-8" ?>
但是看起来有点烦人,你也可以构建一个宏。
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^!" & echo !line!
你是 100% 正确的。我一定看过什么!【参考方案5】:
输出>
字符的方法是在它前面加上^
转义字符:
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】:这是使用SET
和FOR /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中工作。以上是关于使用带有特殊字符的批处理回显的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PHP“回声”中插入带有撇号和其他特殊字符的文本? [复制]