You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复批处理脚本以从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

原脚本问题分析

  1. 多标签替换冲突:循环中对每一行依次替换所有目标标签,导致即使匹配到某一个标签,后续的替换操作会破坏剩余内容,最终提取不到有效信息。
  2. 无分组标记:没有跟踪当前行所属的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:45:03