如何将特殊字符(如尖括号)输出到HTML / XHTML / XML文件中?

3
我希望把以下内容放入文件中:<ScriptFile Make="3">
由于字符串包含尖括号<>以及双引号字符",所以失败了。
我试过对这些字符进行转义:^<ScriptFile Make=""3""^>
它起作用了,但是在文件中输出的结果与转义后的字符串完全相同。
代码片段:
@echo off

set TEMP="^<ScriptFile Make=""3""^>"
echo %TEMP% > gen.xml
pause

如何输出TEMP变量的字符串值到文件gen.xml,不丢失双引号和尖括号?

3个回答

3
你可以这样从变量中提取出 尖括号
@echo off
set TEMP1=ScriptFile Make="3"
echo ^<%TEMP1%^> > gen.xml
pause

这样,括号就可以被正确地转义,您不需要为放入变量的字符串进行任何特殊转义,而且 gen.xml 的样子也符合预期:
D:\temp>type gen.xml
<ScriptFile Make="3">

太聪明了!谢谢。 - Lucas
很高兴答案有所帮助。 - keenthinker

1
这对我有用:

这对我有用:

@echo off

set "TEMP=^<ScriptFile Make="3"^>"
echo %TEMP% > gen.xml
pause

另一种方法是使用延迟扩展:
@echo off

set "TEMP=<ScriptFile Make="3">"
setlocal EnableDelayedExpansion
echo !TEMP! > gen.xml
endlocal
pause

0

TEMP 不应作为环境变量名称使用,因为 TEMP 是 Windows 预定义的重要环境变量。它的值是当前用户帐户临时文件目录的完整路径名。有关详细信息,请参阅维基百科文章 Windows 环境变量

一种方法是使用延迟扩展,正如 Andriy M 建议的那样。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "TempVar=<ScriptFile Make="3">"
echo !TempVar!>gen.xml
endlocal

首先,创建一个本地环境,启用命令扩展和延迟扩展环境变量,这两个都是必需的。命令扩展默认情况下已启用,但延迟扩展默认情况下未启用。请参见this answer,详细解释SETLOCALENDLOCAL命令的作用。

接下来将字符串<ScriptFile Make="3">分配给环境变量TempVar。不需要转义尖括号或双引号。有关为什么在此字符串中不需要转义任何内容以及为什么第一个双引号字符位于变量名左侧而不是等号后面,请阅读this answer以获取详细说明。

使用延迟扩展将环境变量的值通过命令ECHO输出,并使用重定向运算符>将此输出重定向到文件gen.xml中。

在第二个感叹号!和重定向运算符>之间没有空格字符。这避免了在文件中<ScriptFile Make="3">后面也写入尾随空格。在解析此命令行时,>和文件名gen.xml之间的1个或多个空格字符将被忽略。但是,重定向运算符>左侧的任何空白字符也会被ECHO命令输出,并因此写入文件。

另一种方法是根本不使用环境变量,并使用字符caret ^转义角括号,如下所示:

@echo off
echo ^<ScriptFile Make="3"^>>gen.xml
endlocal

在使用ECHO命令时,双引号不应该被转义,因为在这种特殊情况下,双引号字符会被解释为字面字符。

为了理解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • set /?
  • setlocal /?

还要阅读Microsoft TechNet文章Using command redirection operators


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接