
我有一個如下所示的批次腳本來建立具有特定結構和標籤排列的 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
如果你堅持使用單行,延遲擴展結合換行符已經是最簡單的方法了。如果你想避免延遲擴展,還有其他方式來表達變量,如中所述這個線程。