这也许真的很容易,但是网上没有答案。我想通过批处理将XML行回显到文件中,但是它误解了XML结束标记以进行重定向“>”。该行如下:
echo <?xml version="1.0" encoding="utf-8" ?> > myfile.xml
有什么方法可以提示批处理解析器不解释特殊字符串吗?我使用了双引号,但它也会将它们写入文件!回显后,文件应如下所示:
<?xml version="1.0" encoding="utf-8" ?>
这也许真的很容易,但是网上没有答案。我想通过批处理将XML行回显到文件中,但是它误解了XML结束标记以进行重定向“>”。该行如下:
echo <?xml version="1.0" encoding="utf-8" ?> > myfile.xml
有什么方法可以提示批处理解析器不解释特殊字符串吗?我使用了双引号,但它也会将它们写入文件!回显后,文件应如下所示:
<?xml version="1.0" encoding="utf-8" ?>
Answers:
您可以使用以下命令转义外壳元字符^
:
echo ^<?xml version="1.0" encoding="utf-8" ?^> > myfile.xml
请注意,由于echo
是内置的Shell,它不遵循关于引用的常规约定,因此仅引用参数即可输出引号而不是将其删除。
<
和>
。没什么特别的。话虽这么说,但echo
出于某些明显的原因,我建议不要在一行上输入大型XML文件。
另一种方法:
@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__
吗?
一种简单的解决方案是使用延迟扩展,因为这不会更改任何特殊字符。
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
echo !line!
只要没有将工作!
中的line
变量。有什么补救办法吗?
line
包含a !
,它将正常工作,但是如何将感叹号添加到变量中并不总是很明显。试试set "line=Hello^!" & echo !line!
乔伊的答案对我不起作用。执行后
echo ^<?xml version="1.0" encoding="utf-8" ?^> > myfile.xml
我收到此错误提示:语法错误,意外标记“>”附近
此解决方案为我工作:
echo "<?xml version=\"1.0\" encoding=\"utf-8\">" > myfile.txt
这是使用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 %]}%
逃脱角色^
也对我不起作用。单引号对我有用(使用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>"
]