@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 a
name . First cab off the rank is to see whether the token starts
list , so the token is
ECHO ed into
FINDSTR which looks for a line beginning (
/b`) "list". findstring が探しているものを見つけた場合、ERRORLEVEL は 0 に設定され、そうでない場合は 0 以外に設定されます。
errorlevel が設定されていない場合は1 or greater
、SOMETHING に設定されている限り、何にでも設定できます。その後、サブルーチンは終了します。TLIST
Y
トークンの開始ではなかった場合は、ターゲット トークンごとにルーズになりますlist
。:analyse
見つかった場合は、適切なフラグを設定します。
最後に、トークンがそうでない/LISTNAMEBEINGPROCESSED
場合、ルーチンは終了します。/list...
IS が見つかった場合、値トークンが表示されてからクリアされます。
一方、FOR
ループに戻ると、 への呼び出しに続いて:analyse
、ルーチンの決定は、環境内で SET を開始する ( 、 、)tlist
のtentry
最大1 つに含まれます。tname が設定されている場合、対応する値トークンが適切なメタ変数から割り当てられます - - リスト名が設定されている場合、および- その他のデータ項目。関心のないノードについては、フラグは返されないため、ループは単純に次の行に進みます。ttoken
toutput
%%i
tlist
%%j
:analyse
FOR