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

Ami*_*deh 64 batch-file echo

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

echo <?xml version="1.0" encoding="utf-8" ?> > myfile.xml
Run Code Online (Sandbox Code Playgroud)

是否有任何方法可以提示批量解析器不解释特殊字符串?我使用双引号但它也将它们写入文件!echo之后文件应如下所示:

<?xml version="1.0" encoding="utf-8" ?>
Run Code Online (Sandbox Code Playgroud)

Joe*_*oey 96

您可以使用以下命令转义shell元字符^:

echo ^<?xml version="1.0" encoding="utf-8" ?^> > myfile.xml
Run Code Online (Sandbox Code Playgroud)

请注意,由于echo是内置的shell,它不遵循有关引用的常规约定,因此只需引用参数将输出引号而不是删除引号.

  • 不需要经常批处理,我一直忘记我的前5个非法`echo`字符:`<`,`>`,```,`(`和`)`.所有都可以用插入符号^ ^分隔.更多非法字符[这里](http://www.robvanderwoude.com/escapechars.php),但大多数都不在我的典型用例中. (4认同)
  • @Nevin:你仍然需要逃避每一个`<`和`>`.没什么特别的.话虽这么说,我建议不要在一行上回复`echo`大型XML文件......有点明显的原因. (3认同)

orb*_*boy 21

为了在Windows上使用带有echo的特殊字符,例如'>',您需要在它之前放置一个特殊的转义字符.

例如

echo A->B
Run Code Online (Sandbox Code Playgroud)

将无效,因为'>'必须通过'^'进行转义:

 echo A-^>B
Run Code Online (Sandbox Code Playgroud)

另请参见转义序列. 在此输入图像描述

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

  • 但是对于引号,插入符号是转义字符,使用两个引号是错误的,因为它只是添加了第二个引号。`echo Line1"" &amp; echo line2` vs `echo Line1^" &amp; echo line2` (2认同)

wal*_*2mi 20

另一种方法:

@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 # 
Run Code Online (Sandbox Code Playgroud)


jeb*_*jeb 16

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

set "line=<?xml version="1.0" encoding="utf-8" ?>"
setlocal EnableDelayedExpansion
(
  echo !line!
) > myfile.xml
Run Code Online (Sandbox Code Playgroud)

编辑:另一种解决方案是使用消失的报价.

此技术使用引号引用特殊字符

@echo off
setlocal EnableDelayedExpansion
set ""="
echo !"!<?xml version="1.0" encoding="utf-8" ?>
Run Code Online (Sandbox Code Playgroud)

这个技巧有效,因为在特殊字符阶段,前导引号!"!将保留行的其余部分(如果没有其他引号).
在延迟扩展阶段,!"!将替换为变量的内容"(单引号是合法的名称!).

如果您正在使用禁用延迟扩展,则可以使用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
Run Code Online (Sandbox Code Playgroud)

  • 不,如果`line` 包含一个`!` 那么它就可以正常工作,但是如何将感叹号放入变量并不总是很明显。试试 `set "line=Hello^!" &回声!行!` (3认同)

Ale*_*s G 10

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

echo ^>
Run Code Online (Sandbox Code Playgroud)

将打印简单

>
Run Code Online (Sandbox Code Playgroud)