在 .bat 文件中,使用 ^ 转义 < 符号不起作用

在 .bat 文件中,使用 ^ 转义 < 符号不起作用

我正在尝试编写一个可以生成一些 XML 配置文件的批处理文件,但转义 < 和 > 符号似乎不起作用。在脚本的开头,我写了一个测试:

SET test=^<foo^>^<bar what="cat"^>^</foo^>
ECHO %test%

输出如下所示:

Z:\mypath>SET test=<foo><bar what="cat"></foo>
< was unexpected at this time.

Z:\mypath>ECHO <foo><bar what="cat"></foo>

由于没有触发后面的 ECHO,因此脚本的其余部分未执行。

我做错了什么?如何解决?我正在使用 Windows 8.1。

答案1

逃跑是有效的,只是你逃跑的次数不够多。

对于您的代码,您必须转义两次:一次用于 SET 命令,第二次用于 ECHO。SET 的代码有两次转义。执行后,test 的值将包含一次转义,以便 ECHO 正常工作。

SET test=^^<foo^^>^^<bar what="cat"^^>^^</foo^^>
ECHO %test%

如果直接 ECHO 该值,则可以使用单次转义来实现:

ECHO test=^<foo^>^<bar what="cat"^>^</foo^>

或者如果你使用延迟扩展:

setlocal enableDelayedExpansion
SET test=^<foo^>^<bar what="cat"^>^</foo^>
ECHO !test!

如果将赋值括在引号中,则可以消除所有转义:

setlocal enableDelayedExpansion
SET "test=<foo><bar what="cat"></foo>"
ECHO !test!

请记住,在上面的例子中,“cat”在分配期间不再被引用,因此您必须转义可能出现在那里的任何有毒字符。

如果你有很多文字需要写,那么可能值得使用我的PrintHere.bat 实用程序模拟 unix here document 功能。假设您的 PATH 中的文件夹中有 PrintHere.bat,则可以使用:

call PrintHere :test
<foo><bar what="cat"></foo>
:test

答案2

在 .bat 文件中,使用 ^ 转义 < 符号不起作用

您可以通过引用整个参数来解决这个set问题:

SET "test=<foo><bar what="cat"></foo>"

这将正确设置值test

F:\test>set test
test=<foo><bar what="cat"></foo>

您可以通过引用来呼应其值test

F:\test>echo "%test%"
"<foo><bar what="cat"></foo>"

如果你test不使用引号,则会收到错误:

F:\test>echo %test%
< was unexpected at this time.

相关内容