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


74

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

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

有什么方法可以提示批处理解析器不解释特殊字符串吗?我使用了双引号,但它也会将它们写入文件!回显后,文件应如下所示:

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



Answers:


112

您可以使用以下命令转义外壳元字符^

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

请注意,由于echo是内置的Shell,它不遵循关于引用的常规约定,因此仅引用参数即可输出引号而不是将其删除。


4
@Nevin:你还有逃跑每个<>。没什么特别的。话虽这么说,但echo出于某些明显的原因,我建议不要在一行上输入大型XML文件。
乔伊

:很抱歉再次询问..它对我不起作用...代码如下。抱歉,没有以正确的格式提供代码echo ^ <?xml version =“ 1.0” encoding =“ utf-8”?^> ^ <configuration ^> ^ <packageSources ^> ^ <添加key =“ nuget.org”值=“ nuget.org/api/v2/”; / ^> ^ <添加键=“ aspnetwebstacknightlyrelease” value =“ myget.org/f/aspnetwebstacknightlyrelease/”; / ^> ^ </ packageSources ^> ^ </ configuration ^>> MyFile.xml – Nevin Raj 1小时前
Nevin Raj Victor

1
@Nevin:里面有分号,不应该在那里。除此之外,它还会为我生成有效的XML。
乔伊

您完全正确。.分号引起了麻烦。.谢谢
Nevin Raj Victor

4
不需要批量,很多时候,我一直忘了我的前5名非法echo字符:<>'()。所有人都可以用尖号分隔^这里有更多的非法字符但大多数都不在我的典型用例中。
Rich C

24

为了在回显中使用特殊字符(例如在Windows上使用“>”),您需要在其前面放置特殊的转义字符。

例如

echo A->B

将不起作用,因为必须将'>'换成'^':

 echo A-^>B

另请参见转义序列在此处输入图片说明

有一个简短的批处理文件,它打印一组基本的特殊字符及其转义序列。


2
但是对于引号,插入号是转义字符,使用两个引号是错误的,因为它仅添加了第二个引号。echo Line1"" & echo line2vsecho Line1^" & echo line2
jeb 2015年

感谢您提供示例表格。它帮助了我多个角色。

21

另一种方法:

@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 # 

好主意,在脚本中添加数据!
10

从批处理文件中解压缩文本文件的好方法。该行if defined $ echo(%%_应扩展为if defined $ echo(%%_ >> myxmlfile.xml将输出复制到文件中。
PMF

1
我们里面可以有变量__DATA__吗?
bilogic

19

一种简单的解决方案是使用延迟扩展,因为这不会更改任何特殊字符。

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

1
echo !line!只要没有将工作!中的line变量。有什么补救办法吗?
Davor Josipovic

2
不,如果line包含a !,它将正常工作,但是如何将感叹号添加到变量中并不总是很明显。试试set "line=Hello^!" & echo !line!
jeb

你是100%正确的。我一定看过东西!
Davor Josipovic

10

输出>字符的方法是在其前面加上^转义字符:

echo ^>

将简单地打印

>

2

乔伊的答案对我不起作用。执行后

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

我收到此错误提示:语法错误,意外标记“>”附近

此解决方案为我工作:

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

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


1
请注意,这会保留输出中的引号
Ohad Schneider

0

为什么不使用单引号?

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

输出

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

2
问题是关于批次/ cmd。这肯定不能批量/ cmd。
斯蒂芬

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 %]}%

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

问题是关于批次/ cmd。这肯定不能批量/ cmd。
斯蒂芬
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.