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

这可能很容易,但networking上没有答案。 我想通过批量回显一个XML行到一个文件,但它误解redirect的XML结束标记“>”。 线路如下:

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

有没有什么办法来提示批处理parsing器不解释一个特殊的string? 我用双引号,但它也写入文件! echo后的文件应该是这样的:

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

你可以用^来转义shell元字符:

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

请注意,因为echo是一个内置的shell,所以它不会遵循关于引用的常规约定,所以只要引用该参数就会输出引号而不是删除它们。

另一种方法:

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

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

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

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

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

 @echo off setlocal EnableDelayedExpansion set ""=" echo !"!<?xml version="1.0" encoding="utf-8" ?> 

这个技巧的作用就像在特殊字符阶段一样, !"!引号将保留行的其余部分(如果没有其他引号的话)。
而在延期扩张阶段, !"!将被replace为variables的内容" (一个单引号是一个合法的名字!)。

如果您正在使用禁用延迟扩展,则可以使用FOR /F循环。

for /f %%^" in ("""") do echo(%%~" <?xml version="1.0" encoding="utf-8" ?>

但是,由于似乎有点烦人,你也可以build立一个macros。

 set "print=for /f %%^" in ("""") do echo(%%~"" %print%<?xml version="1.0" encoding="utf-8" ?> %print% Special characters like &|<>^ works now without escaping 

为了在Windows上使用特殊字符(例如'>'),需要在它之前放置一个特殊的转义字符。

例如

 echo A->B 

将无法工作,因为'>'必须被'^'转义:

  echo A-^>B 

另请参阅转义序列 。 在这里输入图像说明

有一个短的batch file,它打印一组基本的特殊字符及其转义序列。

输出>字符的方法是用^转义字符加上:

 echo ^> 

将打印简单

 > 

乔伊的回答并不适合我。 执行后

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

我得到这个错误bash:语法错误附近的意外令牌`>'

这个解决scheme为我工作:

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

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