【问题标题】:How to output special characters like angle brackets into an HTML/XHTML/XML file?如何将尖括号等特殊字符输出到 HTML/XHTML/XML 文件中?
【发布时间】:2014-03-15 11:10:48
【问题描述】:

我想将以下内容放入文件中:<ScriptFile Make="3">
由于包含尖括号<> 以及双引号字符" 的字符串,它失败了。

我尝试过以下方式转义字符:^<ScriptFile Make=""3""^>
它有效,但文件中的输出与转义字符串完全相同。

代码sn-p:

@echo off

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

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

【问题讨论】:

    标签: windows file batch-file


    【解决方案1】:

    您可以将尖括号从变量中提取出来,如下所示:

    @echo off
    set TEMP1=ScriptFile Make="3"
    echo ^<%TEMP1%^> > gen.xml
    pause
    

    这样,括号可以正确转义,您不需要对放入变量中的字符串进行任何特殊转义,并且 gen.xml 看起来像预期的那样:

    D:\temp>type gen.xml
    <ScriptFile Make="3">
    

    【讨论】:

    • 太聪明了!谢谢。
    • 很高兴这个答案有帮助。
    【解决方案2】:

    这对我有用:

    @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
    

    【讨论】:

      【解决方案3】:

      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 详细解释命令 SETLOCALENDLOCAL 的作用。

      字符串&lt;ScriptFile Make="3"&gt; 分配在环境变量TempVar 旁边。无需转义尖括号或双引号。有关为什么不需要转义此字符串中的任何内容以及为什么第一个双引号字符位于变量名左侧而不是等号之后的详细说明,请阅读 this answer

      环境变量的值由命令 ECHO 输出,并使用重定向运算符 &gt; 使用延迟扩展将此输出重定向到文件 gen.xml

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

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

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

      在使用命令 ECHO 时不能对双引号进行转义,因为在这种特殊情况下,双引号字符被解释为文字字符。

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

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

      另请阅读 Microsoft TechNet 文章 Using command redirection operators

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-10
        • 2011-12-24
        • 1970-01-01
        • 2013-08-14
        相关资源
        最近更新 更多