
Tengo un script por lotes como el siguiente para crear un archivo XML con una estructura y disposición de etiquetas 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
Ahora mi objetivo es crear un archivo XML como el siguiente código XML de ejemplo, con una cantidad específica de nuevas líneas y caracteres de tabulación siempre que sea necesario para la sangría. También sé cómo imprimir la nueva línea y las tabulaciones en archivos por lotes, como ha visto en el script anterior. :
<?xml version="1.0"?>
<config>
<modules>
<Company_Module>
<active>true</active>
<codePool>community</codePool>
</Company_Module>
</modules>
</config>
Pero cuando creo el archivo XML, en realidad siempre tiene un formato incorrecto, como se muestra a continuación:
<?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>
¿Alguien puede decirme por qué sucede esto y cómo resolverlo únicamente mediante códigos de lote y estándares?
Respuesta1
No importa, descubrí la solución por mi cuenta buscando en Google trucos de impresión de caracteres de secuencias de comandos por lotes.
Lo resolví usando ENABLEDELAYEDEXPANSION
way en un script por lotes.
Espero que cualquiera que tenga el mismo problema encuentre útil el siguiente script:
@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
Después de usar el script anterior con argumentos: "Compañía1", "Módulo1", "local"; En ese orden, generé el siguiente documento XML:
<?xml version="1.0"?>
<config>
<modules>
<Company1_Module1>
<active>true</active>
<codePool>local</codePool>
</Company1_Module1>
</modules>
</config>
Gracias de cualquier manera. Si alguien tiene un enfoque mejor y más breve, no dude en publicarlo aquí.
Respuesta2
¿Tiene que estar en una sola línea? Usando cmd, puedes encontrarte rápidamente con la limitación de la longitud de la línea de esa manera. Si usar varias líneas es una opción:
@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
Si insiste en usar una sola línea, la expansión retrasada en combinación con el carácter de nueva línea ya es el método más simple. Si desea evitar una expansión retrasada, también existen otras formas de expresar la variable, como se explica eneste hilo.