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

时间:2011-09-05 13:10:39

标签: batch-file echo

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

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

有没有办法提示批量解析器不解释特殊字符串?我使用双引号但它也将它们写入文件! echo:

之后文件应如下所示
<?xml version="1.0" encoding="utf-8" ?>

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

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

答案 5 :(得分:0)

为什么不使用单引号?

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

输出

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

答案 6 :(得分:0)

这是使用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 %]}%

答案 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>"
    ]