我想把以下内容放入文件:<ScriptFile Make="3">
失败的原因是字符串中包含尖括号<
和>
以及双引号"
。
我已经尝试转义以下方式的字符:^<ScriptFile Make=""3""^>
它可以工作,但是文件中的输出与转义后的字符串完全相同。
代码片段:
@echo off
set TEMP="^<ScriptFile Make=""3""^>"
echo %TEMP% > gen.xml
pause
我如何输出TEMP
变量的字符串值到文件gen.xml
而不丢失双引号和尖括号?
您可以从变量中提取尖括号,如下所示:
@echo off
set TEMP1=ScriptFile Make="3"
echo ^<%TEMP1%^> > gen.xml
pause
这样,括号可以正确转义,您不需要对变量中的字符串进行任何特殊转义,并且gen.xml看起来像预期的那样:
D:temp>type gen.xml
<ScriptFile Make="3">
这对我有用:
@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
TEMP
不应该用作环境变量名,因为TEMP
是Windows预定义的重要环境变量。它的值为当前用户帐户的临时文件的完整路径的目录名。有关详细信息,请参阅维基百科文章Windows环境变量。
一种方法是使用Andriy M.建议的延迟展开。
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "TempVar=<ScriptFile Make="3">"
echo !TempVar!>gen.xml
endlocal
首先为接下来的两个命令行创建一个本地环境,其中启用了命令扩展名和环境变量的延迟扩展,这两个都是这里需要的。命令扩展默认开启,延迟扩展默认关闭。请参阅这个答案,详细解释SETLOCAL和ENDLOCAL命令的作用。
在环境变量TempVar
后面赋值字符串<ScriptFile Make="3">
。不需要转义尖括号或双引号。要详细解释为什么不需要转义这个字符串中的任何内容,为什么第一个双引号字符在变量名的左边,而不是在等号后面,请阅读这个答案。
环境变量的值由命令ECHO输出,并使用重定向操作符>
使用延迟扩展将该输出重定向到文件gen.xml
中。
第二个感叹号!
和重定向操作符>
之间没有空格。这样可以避免在<ScriptFile Make="3">
后面写入尾随空格到文件中。在解析该命令行时,忽略>
和文件名gen.xml
之间的1个或多个空格字符。但是重定向操作符>
左边的任何空白字符也由命令ECHO输出,因此也写入文件中。
另一种方法是根本不使用环境变量,并使用插入符号^
转义尖括号,如下所示:
@echo off
echo ^<ScriptFile Make="3"^>>gen.xml
endlocal
在使用ECHO命令时,双引号不能转义,因为在这种特殊情况下,双引号字符被解释为文字字符。
为了理解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
-
echo /?
-
endlocal /?
-
set /?
-
setlocal /?
并阅读Microsoft TechNet文章使用命令重定向操作符