批处理脚本的 XML 格式不正确

批处理脚本的 XML 格式不正确

我有一个如下所示的批处理脚本,用于创建具有特定结构和标签排列的 XML 文件。

@ECHO OFF
SET ROOTPATH=%~dp0
SET LINEBREAK=^^%NLM%%NLM%^%NLM%%NLM%
SET "TAB=   "
SET /p COMPANY="Company Name: "
SET /p MODULE="Module Name: "
SET /p CODEPOOL="Code Pool: "
ECHO ^<?xml version="1.0"?^>"%LINEBREAK%"^<config^>"%LINEBREAK%""%TAB%"^<modules^>"%LINEBREAK%""%TAB%""%TAB%"^<"%COMPANY%_%MODULE%"^>"%LINEBREAK%""%TAB%""%TAB%""%TAB%"^<active^>true^</active^>"%LINEBREAK%""%TAB%""%TAB%""%TAB%"^<codePool^>local^</codePool^>"%LINEBREAK%""%TAB%""%TAB%"^</"%COMPANY%_%MODULE%"^>"%LINEBREAK%""%TAB%"^</modules^>"%LINEBREAK%"^</config^>>"%ROOTPATH%app\etc\modules\%COMPANY%_%MODULE%.xml"
PAUSE

现在我的目标是创建一个类似下面示例 XML 代码的 XML 文件,其中包含特定数量的换行符和制表符以便缩进,而且我还知道如何在批处理文件中打印换行符和制表符,正如您在上面给出的脚本中所看到的那样:

<?xml version="1.0"?>
<config>
    <modules>
        <Company_Module>
            <active>true</active>
            <codePool>community</codePool>
        </Company_Module>
    </modules>
</config>

但是当我创建 XML 文件时,它实际上总是格式不正确,如下所示:

<?xml version="1.0"?>"^SET "TAB=    ""<config>"^SET "TAB=   """"<modules>"^SET "TAB=    """"""<"Company_Module">"^SET "TAB= """"""""<active>true</active>"^SET "TAB=    """"""""<codePool>local</codePool>"^SET "TAB=   """"""</"Company_Module">"^SET "TAB=    """"</modules>"^SET "TAB=   ""</config>

有人能告诉我为什么会发生这种情况以及如何仅通过批处理代码和标准来解决它吗?

答案1

没关系,我通过谷歌搜索批量脚本字符打印技巧自己找到了解决方案。

我使用ENABLEDELAYEDEXPANSION批处理脚本的方法解决了这个问题。

希望遇到同样问题的人会发现以下脚本很有用:

@ECHO OFF
SET ROOTPATH=%~dp0
SET \t= 
SET /p COMPANY="Company Name: "
SET /p MODULE="Module Name: "
SET /p CODEPOOL="Code Pool: "
(SET \n=^
%=DONT REMOVE THIS=%
)
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO ^<?xml version="1.0"?^>!\n!^<config^>!\n!%\t%^<modules^>!\n!%\t%%\t%^<%COMPANY%_%MODULE%^>!\n!%\t%%\t%%\t%^<active^>true^</active^>!\n!%\t%%\t%%\t%^<codePool^>local^</codePool^>!\n!%\t%%\t%^</%COMPANY%_%MODULE%^>!\n!%\t%^</modules^>!\n!^</config^>>%ROOTPATH%app\etc\modules\%COMPANY%_%MODULE%.xml
ENDLOCAL

按顺序使用带有参数“Company1”、“Module1”、“local”的上述脚本后,我生成了以下 XML 文档:

<?xml version="1.0"?>
<config>
    <modules>
        <Company1_Module1>
            <active>true</active>
            <codePool>local</codePool>
        </Company1_Module1>
    </modules>
</config>

无论如何,谢谢。如果有人有更好、更简短的方法,请随时在此处发布。

答案2

它必须在一行中吗?使用 cmd,你很快就会遇到行长限制。如果使用多行是一种选择:

@ECHO OFF
SET ROOTPATH=%~dp0
SET \t=   
SET /p COMPANY="Company Name: "
SET /p MODULE="Module Name: "
SET /p CODEPOOL="Code Pool: "

(
echo.^<?xml version="1.0"?^>
echo.^<config^>
echo.%\t%^<modules^>
echo.%\t%%\t%^<%COMPANY%_%MODULE%^>
echo.%\t%%\t%%\t%^<active^>true^</active^>
echo.%\t%%\t%%\t%^<codePool^>%CODEPOOL%^</codePool^>
echo.%\t%%\t%^</%COMPANY%_%MODULE%^>
echo.%\t%^</modules^>
echo.^</config^>
)>>%ROOTPATH%app\etc\modules\%COMPANY%_%MODULE%.xml

如果你坚持使用单行,那么延迟扩展与换行符的组合已经是最简单的方法。如果你想避免延迟扩展,还有其他方式来表达变量,如中所述此主题

相关内容