如何修复批处理脚本以从XML文件提取指定参数
修复批处理脚本提取XML指定参数的问题
问题描述
需要从test_123.xml中提取<HostIP>、<UserId>、<FilePath>、<FileName>、<QueueManager>这5个参数,并按所属Node分组写入result.txt,原批处理脚本运行后无输出,无法得到预期结果。
目标XML文件内容
<?xml version="1.0" encoding="ascii" ?> <RunTimeModule Type="FlowManager"> <Id>3</Id> <Name>test_123</Name> <StandAlone>Y</StandAlone> <Log> <Mode>DEBUG</Mode> <Path>/test01/log</Path> <Retention>7</Retention> </Log> <UXCodes> <System>UXtest510</System> <User>UXtest510</User> </UXCodes> <Alert> <Frequency>15</Frequency> </Alert> <FlowManager> <LoopingFrequency>120</LoopingFrequency> <ProcessAndTerminate>N</ProcessAndTerminate> <CleanUpMemoryAfterProcess>Y</CleanUpMemoryAfterProcess> <CleanUpMemoryThreshholdInMB>5</CleanUpMemoryThreshholdInMB> <RetryAttempts>Infinite</RetryAttempts> <Node Id="1" Name="SourceFtp"> <Adapter Type="Source" TypeName="Ftp" Module="ftp.dll"/> <InputParameters> <Parameter Name="FilePath" Value="/test_dev/TestSend/"/> <Parameter Name="FileName" Value="*.txt"/> <Parameter Name="MarkData"> <SubParameter Name="RenameFile" Value="Y"/> </Parameter> <Parameter Name="LogonAttempts" Value="10"/> <Parameter Name="FtpProperties"> <SubParameter Name="HostIP" Value="192.168.10.5"/> <SubParameter Name="HostName" Value="test01"/> <SubParameter Name="UserId" Value="test01"/> <SubParameter Name="Password" Value="_SSC_PASSWORD_AT_LOGIN"/> <SubParameter Name="Port" Value="21"/> <SubParameter Name="TransferMode" Value="ASCII"/> <SubParameter Name="CheckFileSize" Value="N"/> <SubParameter Name="ConnectionTimeOut" Value="540"/> </Parameter> </InputParameters> </Node> <Node Id="2" Name="DestinationPriceQ"> <Adapter Type="Destination" TypeName="MQ" Module="asmq.dll"/> <InputParameters> <Parameter Name="QueueManager" Value="QT0012"/> <Parameter Name="Queue" Value="EPH.TEST.IN.OUT"/> <Parameter Name="UseCCDT" Value="Y"/> <Parameter Name="PutMessageOptions"> <SubParameter Name="Group:EnableMessageGrouping" Value="N"/> </Parameter> <Parameter Name="MQMD"> <SubParameter Name="Segmentation" Value="N"/> <SubParameter Name="LogicalOrder" Value="N"/> <SubParameter Name="Format" Value="MQSTR"/> </Parameter> <Parameter Name="$Data$" Map="Source.Ftp.1.$Data$"/> </InputParameters> </Node> </FlowManager> </RunTimeModule>
原错误脚本
@echo off setlocal EnableDelayedExpansion (for /F "delims=" %%a in ('findstr /I /L "<HostIP> <UserId> <FilePath> <FileName> <QueueManager>" H:\test_123.xml') do ( set "line=%%a" set "line=!line:*<HostIP>=!" set "line=!line:*<UserId>=!" set "line=!line:*<FilePath>=!" set "line=!line:*<FileName>=!" set "line=!line:*<QueueManager>=!" for /F "delims=<" %%b in ("!line!") do echo %%b ) ) > result.txt
原脚本问题分析
- 多标签替换冲突:循环中对每一行依次替换所有目标标签,导致即使匹配到某一个标签,后续的替换操作会破坏剩余内容,最终提取不到有效信息。
- 无分组标记:没有跟踪当前行所属的
Node,无法实现按Node分组输出的需求。
修复后的脚本
@echo off setlocal EnableDelayedExpansion set "currentNode=" set "outputFile=result.txt" del "%outputFile%" 2>nul (for /F "delims=" %%a in ('findstr /I /L "<Node Id=" "<HostIP>" "<UserId>" "<FilePath>" "<FileName>" "<QueueManager>" H:\test_123.xml') do ( set "line=%%a" rem 检测当前行是否为Node标签,提取Node ID echo !line! | findstr /I "<Node Id=" >nul if not errorlevel 1 ( for /F "tokens=3 delims== " %%b in ("!line!") do ( set "currentNode=%%b" rem 去除引号 set "currentNode=!currentNode:"=!" echo.>>"%outputFile%" echo 来自Node Id="!currentNode!"的内容:>>"%outputFile%" echo.>>"%outputFile%" ) ) else ( rem 筛选目标参数行,直接写入文件 echo !line! | findstr /I "<HostIP>" "<UserId>" "<FilePath>" "<FileName>" "<QueueManager>" >nul if not errorlevel 1 ( echo !line!>>"%outputFile%" ) ) )) endlocal
预期输出
运行修复后的脚本,result.txt内容如下:
来自Node Id="1"的内容: <Parameter Name="FilePath" Value="/test_dev/TestSend/"/> <Parameter Name="FileName" Value="*.txt"/> <SubParameter Name="HostIP" Value="192.168.10.5"/> <SubParameter Name="UserId" Value="test01"/> 来自Node Id="2"的内容: <Parameter Name="QueueManager" Value="QT0012"/>
内容的提问来源于stack exchange,提问作者Learning_something_new
相关产品推荐
相关产品推荐

