这可能很容易,但网上没有答案。我想通过批处理将XML行回显到文件中,但是它误解了重定向“>”的XML结束标记。该行如下:
echo <?xml version="1.0" encoding="utf-8" ?> > myfile.xml
有没有办法提示批量解析器不解释特殊字符串?我使用双引号但它也将它们写入文件! echo:
之后文件应如下所示<?xml version="1.0" encoding="utf-8" ?>
答案 0 :(得分:88)
您可以使用^
转义shell元字符:
echo ^<?xml version="1.0" encoding="utf-8" ?^> > myfile.xml
请注意,由于echo
是内置的shell,因此它不遵循有关引用的常规约定,因此只引用参数将输出引号而不是删除引号。
答案 1 :(得分:18)
另一种方法:
@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 #
答案 2 :(得分:16)
一个简单的解决方案是使用延迟扩展,因为这不会更改任何特殊字符。
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
答案 3 :(得分:10)
输出>
字符的方法是在前面添加^
转义字符:
echo ^>
将简单打印
>
答案 4 :(得分:2)
乔伊的回答并不适合我。 执行后
echo ^<?xml version="1.0" encoding="utf-8" ?^> > myfile.xml
我收到了这个错误 bash:意外令牌附近的语法错误`&gt;'
这个解决方案对我有用:
echo "<?xml version=\"1.0\" encoding=\"utf-8\">" > myfile.txt
答案 5 :(得分:0)
为什么不使用单引号?
echo '<?xml version="1.0" encoding="utf-8" ?>'
输出
<?xml version="1.0" encoding="utf-8" ?>
答案 6 :(得分:0)
这是使用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 %]}%
答案 7 :(得分:-1)
转义字符^
对我也不起作用。
单引号对我有用(使用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>"
]