@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
真的没那么难。问题是一旦它在环境变量中你想用它做什么。显然,如果你想检查缺失的元素,你需要做的就是只使用结果if defined list if defined entry if defined output if defined token
给定输入格式,每行都使用<
和标记化>
。第一个选定的标记应用于 ,%%i
第二个应用于%%j
。行中的第一个标记是前导空格。
因此 %%i 将是节点名称。对于每一行,节点名称被传递给子例程 :analysis for er, analysis。
:analysis 首先清除每个标志 tname
表示token is a
名称. First cab off the rank is to see whether the token starts
列表, so the token is
ECHO ed into
FINDSTR which looks for a line beginning (
/b`) "list"。如果 findstring 找到它要查找的内容,则 ERRORLEVEL 设置为 0,否则设置为非零。
如果 errorlevel 不是1 or greater
,则TLIST
设置为Y
它可以设置为任何值 - 只要它设置为 SOMETHING。然后子程序退出。
如果它不是一个令牌开始,list
那么:analyse
每个目标令牌都会丢失。如果它找到一个,它会设置适当的标志。
最后,如果令牌不是,/LISTNAMEBEINGPROCESSED
则例程退出。如果/list...
找到 IS,则显示值标记然后清除。
同时,回到FOR
循环中,在调用:analyse
之后,例程的决定最多包含在环境中的 ( tlist
, tentry
, ttoken
, toutput
) 中的一个中 ( , , , )。如果设置了 tname,则从适当的元变量中分配相应的值标记%%i
- 如果tlist
设置了列表名称,并且%%j
- 其他的数据项。对于不感兴趣的节点,不返回任何标志,:analyse
因此FOR
循环简单地进行到下一行。