XML formatado incorreto com script em lote

0

Eu tenho um script em lote como abaixo para criar um arquivo XML com estrutura e tags específicas.

@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

Agora pretendo criar um arquivo XML como o código XML abaixo do exemplo, com quantidade específica de novas linhas e caracteres de tabulação sempre que necessário para recuo, também sei como imprimir a nova linha e tabulações em arquivos em lote, como você viu no acima determinado script:

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

Mas quando eu crio o arquivo XML, ele é sempre mal formatado como abaixo:

<?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>

Alguém pode me informar por que isso acontece e como resolvê-lo apenas por código de lote e padrões?

    
por Vicky Dev 21.06.2017 / 18:57

2 respostas

0

Não importa, eu descobri a solução por conta própria de alguns truques de impressão de caracteres de scripts em lote.

Eu resolvi isso usando ENABLEDELAYEDEXPANSION way no script em lote.

Espero que qualquer pessoa com o mesmo problema encontre o script abaixo útil:

@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

Depois de usar o script acima com argumentos: "Company1", "Module1", "local"; nessa ordem, gerei abaixo do documento XML:

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

Obrigado mesmo assim. Se alguém tiver uma abordagem melhor e mais curta, sinta-se à vontade para postar aqui.

    
por 21.06.2017 / 20:15
0

Precisa estar em uma única linha? Usando o cmd, você pode executar rapidamente a limitação para o comprimento da linha dessa maneira. Se usar várias linhas for uma opção:

@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

Se você insistir em usar uma única linha, o delayedexpansion em combinação com o novo caractere de linha já é o método mais simples. Se você quiser evitar a expansão atrasada, também há outras maneiras de expressar a variável, conforme explicado em este tópico .

    
por 21.06.2017 / 22:45