Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅当两个值匹配时才从XML文件提取数据。(使用.bat)_Xml_Batch File - Fatal编程技术网

仅当两个值匹配时才从XML文件提取数据。(使用.bat)

仅当两个值匹配时才从XML文件提取数据。(使用.bat),xml,batch-file,Xml,Batch File,我正在寻找一个.bat脚本,它通过我的XML文件运行,并且只提取指定XML文件的某些数据。只有在名称“Ian”和职位“executive”匹配的情况下,才应提取这些XML文件的数据。如果.bat找到一个匹配的XML文件,它应该只提取3个指定的值 例如: 仅在以下情况下提取: 值应为“Name=Ian” 值应为“职位=高管” 如果这些值匹配,则应提取以下数据: 1.当前工作 2.shortID 3.度假柜台 我希望工作不要太多。XML数据都是相似的 <Name="Ian" workstamp

我正在寻找一个.bat脚本,它通过我的XML文件运行,并且只提取指定XML文件的某些数据。只有在名称“Ian”和职位“executive”匹配的情况下,才应提取这些XML文件的数据。如果.bat找到一个匹配的XML文件,它应该只提取3个指定的值

例如:

仅在以下情况下提取:

  • 值应为“Name=Ian”
  • 值应为“职位=高管”
  • 如果这些值匹配,则应提取以下数据:

    1.当前工作

    2.shortID

    3.度假柜台

    我希望工作不要太多。XML数据都是相似的

    <Name="Ian" workstampIN="2017-04-06" worknumber="XXXX" editor="XXXX" Position="Executive" currentWork="engineer" shortID="543532" holidaycounter="50" >
    
    
    
    等等


    对不起,我对蝙蝠真的很陌生。提前谢谢你的帮助

    考虑:
    batch
    对于解析XML文件来说是一个错误的选择。也就是说:使用适当的标记和分隔符,使用
    for
    循环提取数据:

    @echo off
    setlocal
    for %%z in (*.xml) do call :extract %%z
    goto :eof
    
    :extract
    for /f "tokens=1-8 delims=<> " %%a in (%*) do (
      set _%%a
      set _%%e
      set _%%f
      set _%%g
      set _%%h
    )
    REM set _
    if %_Position%=="Executive" if %_Name%=="Ian" (
      echo 1. %_currentWork%
      echo 2. %_shortID%
      echo 3. %_holidaycounter%
    ) >> outputfile.txt
    goto :eof
    
    @echo关闭
    setlocal
    对于(*.xml)中的%%z,请调用:提取%%z
    后藤:eof
    :摘录
    对于/f“tokens=1-8 delims=“%%a in(%*)do(
    设置%%a
    设置%%e
    设置%%f
    设置%%g
    设置uh%%h
    )
    REM集合_
    如果%\u职位%=“高管”如果%\u姓名%=“伊恩”(
    回波1.%\u当前工作百分比
    回声2.%\u短ID%
    echo 3.%\u holidaycounter%
    )>>outputfile.txt
    后藤:eof
    
    请考虑:
    批处理
    是解析XML文件的错误选择。也就是说:使用适当的标记和分隔符,使用
    for
    循环提取数据:

    @echo off
    setlocal
    for %%z in (*.xml) do call :extract %%z
    goto :eof
    
    :extract
    for /f "tokens=1-8 delims=<> " %%a in (%*) do (
      set _%%a
      set _%%e
      set _%%f
      set _%%g
      set _%%h
    )
    REM set _
    if %_Position%=="Executive" if %_Name%=="Ian" (
      echo 1. %_currentWork%
      echo 2. %_shortID%
      echo 3. %_holidaycounter%
    ) >> outputfile.txt
    goto :eof
    
    @echo关闭
    setlocal
    对于(*.xml)中的%%z,请调用:提取%%z
    后藤:eof
    :摘录
    对于/f“tokens=1-8 delims=“%%a in(%*)do(
    设置%%a
    设置%%e
    设置%%f
    设置%%g
    设置uh%%h
    )
    REM集合_
    如果%\u职位%=“高管”如果%\u姓名%=“伊恩”(
    回波1.%\u当前工作百分比
    回声2.%\u短ID%
    echo 3.%\u holidaycounter%
    )>>outputfile.txt
    后藤:eof
    
    @ECHO OFF
    SETLOCAL enabledelayedexpansion
    设置“sourcedir=U:\sourcedir”
    设置“filename1=%sourcedir%\q4314990.txt”
    设置/a过滤器计数=0
    设置/a字段计数=0
    呼叫:filterset%*
    如果%filtercount%==0转到语法
    如果%fieldcount%==0转到语法
    对于/f“usebackqdelims=“%%a IN”(“%filename1%”)DO(
    设置“行=%%a”
    设置“行=!行:=!”
    设置“行=!行::=!”
    呼叫:过滤器!线路!
    )
    后藤:EOF
    :语法
    回显语法为[requiredname requiredvalue]*::reportfieldname*
    后藤:EOF
    ::设置和计数筛选器和字段
    :过滤器集
    如果“%~1”==”:“转到字段集
    如果“%~1”==”转到:EOF
    设置/a过滤器计数+=1
    设置“$%filtercount%=%~1”
    转移
    设置“#%filtercount%=%~1”
    转移
    GOTO过滤器集
    :字段集
    转移
    如果“%~1”==”转到:EOF
    设置/a字段计数+=1
    设置“\u%fieldcount%=%~1”
    后藤场集
    :过滤器
    对于(1,1,%fieldcount%)中的/L%%z,请设置“@%%z=”
    SET/a matchesfound=0
    :filterloop
    如果“%~1”==”转到报告
    对于(1,1,%filtercount%)中的/L%%z,如果/i“%~1>%~2”==”!$%z!>!#%%z!”设置/a matchesfound+=1,则执行此操作
    对于(1,1,%fieldcount%)中的/L%%z,如果/i“%$1”==”!\uz%%设置“@%%z=%2”,则执行该操作
    移位
    转移
    转到过滤器环路
    :报告
    如果%matchesfound%neq%filtercount%GOTO:EOF
    设置“reportline=”
    对于(1,1,%fieldcount%)中的/L%%z,请设置“reportline=!reportline!!@%%z!”!
    回显(%reportline:~1%
    后藤:eof
    
    您需要更改
    sourcedir
    的设置以适应您的环境

    我使用了一个名为
    q43314990.txt
    的文件,其中包含了您的数据和一些用于测试的虚拟数据

    这个过程应该能解决你的问题

    我假设调用此命令的批处理命令是

    此批次cls和q43314990名称ian position executive::currentWork shortid holidaycounter

    即(fieldname requiredvalue)根据需要重复多次“::”(reportfiledname)根据需要重复多次

    而这一案例并不相关

    第一个操作是通过
    call
    ing
    :filterset
    分析命令行。如果未同时指定筛选器和报告字段,则显示所需的语法

    否则,将每个文件行读到
    %%a
    ,然后再读到
    。处理
    以删除
    (一个先前删除的字符,因此不存在,因此可用于分隔字段)连接起来,并与由$1>#1...?>#构造的相同字符串进行比较。在匹配上,计算匹配数

    然后查看
    %1
    中的文件名是否与
    中的每个所需输出文件名匹配,如果匹配,则将该参数的值从
    %2
    记录到
    @

    然后按住shift键两次以删除名称/值对,然后继续下一个

    当没有剩下参数时,仅当找到的匹配数与筛选器数相同时才报告。在这种情况下,只需通过在空格后串联每个选定字段的值来构建报告行。最终报告是
    echo
    跳过第一个字符(将是空格)

    @echo OFF
    SETLOCAL enabledelayedexpansion
    设置“sourcedir=U:\sourcedir”
    设置“filename1=%sourcedir%\q4314990.txt”
    设置/a过滤器计数=0
    设置/a字段计数=0
    C
    
    call xpath.bat name.xml "//N[@Name='Ian'][@Position='Executive']/@shortID"
    
    @echo off
    setlocal EnableDelayedExpansion
    
    (for /F "tokens=1,2 delims=:<>" %%a in ('findstr "Name=\"Ian\" Position=\"Executive\"" *.xml') do (
       set "list=%%b"
       for /F "delims=" %%c in (^"!list: ^=^
    % Do NOT remove this line %
    !^") do set %%c
       if "!Name!+!Position!" equ ""Ian"+"Executive"" (
          echo File: "%%a", currentWork=!currentWork!, shortID=!shortID!, holidaycounter=!holidaycounter!
       )
    )) > Outputfile.txt