我想将以下内容放入文件中:<ScriptFile Make="3">
由于包含尖括号<
和>
以及双引号字符"
的字符串,它失败了。
我试过以下方式逃避角色:^<ScriptFile Make=""3""^>
它工作正常,但文件中的输出与转义字符串完全相同。
代码段:
@echo off
set TEMP="^<ScriptFile Make=""3""^>"
echo %TEMP% > gen.xml
pause
如何在不丢失双引号和尖括号的情况下将TEMP
变量的字符串值输出到文件gen.xml
中?
答案 0 :(得分:3)
您可以从变量中提取尖括号,如下所示:
@echo off
set TEMP1=ScriptFile Make="3"
echo ^<%TEMP1%^> > gen.xml
pause
这样,括号可以正确转义,你不需要为放入变量的字符串进行任何特殊的转义, gen.xml 看起来像预期的那样:
D:\temp>type gen.xml
<ScriptFile Make="3">
答案 1 :(得分: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
答案 2 :(得分:0)
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。