@ECHO OFF
SETLOCAL
CALL :zapvars
FOR /f "tokens=2,3delims=<>" %%i IN (myxml.xml) DO (
CALL :analyse %%i
IF DEFINED tlist SET list=%%i
IF DEFINED tentry SET entry=%%j
IF DEFINED ttoken SET token=%%j
IF DEFINED toutput SET output=%%j
)
GOTO :eof
:analyse
FOR %%a IN (tlist tentry ttoken toutput) DO (SET %%a=)
ECHO %1|FINDSTR /b "list" >NUL
IF NOT ERRORLEVEL 1 SET tlist=Y&GOTO :EOF
IF "%1"=="entry" SET tentry=Y&GOTO :EOF
IF "%1"=="output" SET toutput=Y&GOTO :EOF
IF "%1"=="token" SET ttoken=Y&GOTO :EOF
IF NOT "%1"=="/%list%" GOTO :EOF
:: Found end of list
ECHO list=%list% entry=%entry% output=%output% token=%token%
:zapvars
FOR %%z IN (list entry output token) DO (SET %%z=)
GOTO :eof
本当にそれほど難しいことではありません。質問は、envvars に入ったら何をしたいかです。明らかに、欠落している要素をチェックしたい場合は、結果のみを使用するだけで済みますif defined list if defined entry if defined output if defined token
入力形式が与えられると、各行は と を使用して<トークン化>されます。最初に選択されたトークンは に適用され%%i、2 番目は に適用されます%%j。行の最初のトークンは先頭のスペースです。
したがって、%%i がノード名になります。行ごとに、ノード名がサブルーチン :analyse に渡されて、分析が行われます。
:analyse は最初に各フラグをクリアします tname意味token is aname . First cab off the rank is to see whether the token startslist , so the token isECHO ed intoFINDSTR which looks for a line beginning (/b`) "list". findstring が探しているものを見つけた場合、ERRORLEVEL は 0 に設定され、そうでない場合は 0 以外に設定されます。
errorlevel が設定されていない場合は1 or greater、SOMETHING に設定されている限り、何にでも設定できます。その後、サブルーチンは終了します。TLISTY
トークンの開始ではなかった場合は、ターゲット トークンごとにルーズになりますlist。:analyse見つかった場合は、適切なフラグを設定します。
最後に、トークンがそうでない/LISTNAMEBEINGPROCESSED場合、ルーチンは終了します。/list...IS が見つかった場合、値トークンが表示されてからクリアされます。
一方、FORループに戻ると、 への呼び出しに続いて:analyse、ルーチンの決定は、環境内で SET を開始する ( 、 、)tlistのtentry最大1 つに含まれます。tname が設定されている場合、対応する値トークンが適切なメタ変数から割り当てられます - - リスト名が設定されている場合、および- その他のデータ項目。関心のないノードについては、フラグは返されないため、ループは単純に次の行に進みます。ttokentoutput%%itlist%%j:analyseFOR