
Ich habe ein Batch-Skript wie unten, um eine XML-Datei mit bestimmter Struktur und Tag-Anordnung zu erstellen.
@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
Jetzt möchte ich eine XML-Datei wie den unten stehenden Beispiel-XML-Code erstellen, mit einer bestimmten Anzahl von Zeilenumbrüchen und Tabulatorzeichen, wann immer dies zur Einrückung nötig ist. Außerdem weiß ich, wie man Zeilenumbrüche und Tabulatoren in Batchdateien druckt, wie Sie im oben angegebenen Skript gesehen haben:
<?xml version="1.0"?>
<config>
<modules>
<Company_Module>
<active>true</active>
<codePool>community</codePool>
</Company_Module>
</modules>
</config>
Aber wenn ich die XML-Datei erstelle, ist sie tatsächlich immer schlecht formatiert, wie unten:
<?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>
Kann mir jemand sagen, warum das passiert und wie ich es nur mit Batchcode und Standards lösen kann?
Antwort1
Macht nichts, ich habe die Lösung selbst herausgefunden, indem ich nach Tricks zum Drucken von Zeichen in Batch-Skripten gegoogelt habe.
Ich habe es gelöst, indem ich ENABLEDELAYEDEXPANSION
ein Batch-Skript verwendet habe.
Ich hoffe, dass das folgende Skript für alle mit demselben Problem hilfreich ist:
@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
Nachdem ich das obige Skript mit den Argumenten „Company1“, „Modul1“, „local“ in dieser Reihenfolge verwendet hatte, habe ich das folgende XML-Dokument erstellt:
<?xml version="1.0"?>
<config>
<modules>
<Company1_Module1>
<active>true</active>
<codePool>local</codePool>
</Company1_Module1>
</modules>
</config>
Trotzdem danke. Wenn jemand einen besseren, kürzeren Ansatz hat, kann er ihn gerne hier posten.
Antwort2
Muss es in einer einzigen Zeile sein? Bei cmd stößt man da schnell an die Beschränkung der Zeilenlänge. Falls die Verwendung mehrerer Zeilen eine Option ist:
@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
Wenn Sie auf einer einzelnen Zeile bestehen, ist die verzögerte Expansion in Kombination mit dem Zeilenumbruchzeichen bereits die einfachste Methode. Wenn Sie die verzögerte Expansion vermeiden möchten, gibt es auch andere Möglichkeiten, die Variable auszudrücken, wie indieser Thread.