
У меня есть пакетный скрипт, подобный приведенному ниже, для создания 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
Если вы настаиваете на использовании одной строки, delayedexpansion в сочетании с символом новой строки уже является самым простым методом. Если вы хотите избежать delayedexpansion, есть также другие способы выражения переменной, как объяснено вэта тема.