TEMP 不应用作环境变量名,因为TEMP 是 Windows 预定义的重要环境变量。它的值是具有完整路径的当前用户帐户的临时文件的目录名称。详情见维基百科文章Windows Environment Variables。
Andriy M 也建议使用延迟扩展。
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "TempVar=<ScriptFile Make="3">"
echo !TempVar!>gen.xml
endlocal
首先为接下来的两个命令行创建一个本地环境,其中启用了命令扩展和环境变量的延迟扩展,这两者都是此处需要的。默认情况下启用命令扩展,但默认禁用延迟扩展。请参阅this answer 详细解释命令 SETLOCAL 和 ENDLOCAL 的作用。
字符串<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。