使用带特殊字符的批量回显
这可能很容易,但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