バッチ スクリプトによる 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

問題ありません。バッチ スクリプト文字印刷のトリックを Google で検索して、自分で解決策を見つけました。

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

1 行にする必要がありますか? 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

どうしても1行で済ませたいのであれば、遅延展開と改行文字の組み合わせが最も簡単な方法です。遅延展開を避けたい場合は、変数を表現する他の方法もあります。このスレッド

関連情報