Batch file 使用批处理文件从一行字符串中提取多个值

Batch file 使用批处理文件从一行字符串中提取多个值,batch-file,cmd,Batch File,Cmd,我试图从已经从文件中提取的字符串中提取FileRef的每个值。不幸的是,字符串只有一行,这使得对/f“tokens=*”使用更加困难 字符串为: "<Cim:TrnTable_list><Cim:TrnTable Id="Root"><Cim:TrnElem Ref="3" FileRef="A1-FS.elt"/><Cim:TrnElem Ref="4" FileRef="A1-MS.elt"/><Cim:TrnElem Ref="9" F

我试图从已经从文件中提取的字符串中提取
FileRef
的每个值。不幸的是,字符串只有一行,这使得对/f“tokens=*”使用
更加困难

字符串为:

"<Cim:TrnTable_list><Cim:TrnTable Id="Root"><Cim:TrnElem Ref="3" FileRef="A1-FS.elt"/><Cim:TrnElem Ref="4" FileRef="A1-MS.elt"/><Cim:TrnElem Ref="9" FileRef="Product\Product-v1\Product-v1-MD.elt"/><Cim:TrnElem Ref="11" FileRef="Product\Product-v2\Product-v2-MD.elt"/><Cim:TrnElem Ref="12" FileRef="RunnerPart_Assembly#1.elt"/></Cim:TrnTable></Cim:TrnTable_list>"
我的意思是,然后我可以使用
为/f“delims=?”
循环它们,对吗

或者,是否有办法将上述示例中的每个
转换为一个字符串中的“新行”,或者甚至有更好的办法通过每个
FileRef
-值进行循环

非常感谢

在his中是正确的,使用一种能够本地处理XML数据的语言

无论如何,如果您坚持使用纯Windows批处理脚本,您可以使用
符号作为分隔符组装一个新字符串,如以下脚本中所示:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“_FILE=%~dpn0.txt”&rem/(包含文本行的文件路径)
(一套)=^
%=空行=%
^“”&rem/(构成新行字符)
rem//初始化集合变量:
设置“COLL=?”
rem//从文件中读取行:
对于/F“usebackq delims=“%%L in”(“%\u FILE%”)do(
设置“行=%%~L”
setlocal EnableDelayedExpansion
rem//Replace`>`+换行符+```:
对于/F“delims=“%”I in(“!LINE!”)do(
端部
设置“项=%%I”
rem//提取`FileRef`和`/>`之间的字符串:
setlocal EnableDelayedExpansion
设置“ITEM=!ITEM:*FileRef=!”
设置“项目=!项目:/>=!”
rem//检查`FileRef`后的`=`-符号:
如果“!项:~,1!”==”(
rem//删除前导“=”和周围的“=”:
对于“(!ITEM:~1!”)中的/F“delims=| eol=|”%%F,请执行以下操作(
端部
设置“名称=%%~F”
rem//使用“?”作为分隔符组装返回字符串:
setlocal EnableDelayedExpansion
对于(“!COLL!!NAME!?”)中的/F“delims=| eol=|”%%J,请执行以下操作(
端部
设置“COLL=%%J”
setlocal EnableDelayedExpansion
)
)
)
)
端部
)
rem//返回集合变量:
setlocal EnableDelayedExpansion
回声(!COLL:~1,-1!
端部
端部
退出/B
进行切换是为了避免符号出现问题

在我看来,比在单个变量中收集所有值更好的方法是循环遍历它们。

在his中是正确的,使用一种能够以本机方式处理XML数据的语言

无论如何,如果您坚持使用纯Windows批处理脚本,您可以使用
符号作为分隔符组装一个新字符串,如以下脚本中所示:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“_FILE=%~dpn0.txt”&rem/(包含文本行的文件路径)
(一套)=^
%=空行=%
^“”&rem/(构成新行字符)
rem//初始化集合变量:
设置“COLL=?”
rem//从文件中读取行:
对于/F“usebackq delims=“%%L in”(“%\u FILE%”)do(
设置“行=%%~L”
setlocal EnableDelayedExpansion
rem//Replace`>`+换行符+```:
对于/F“delims=“%”I in(“!LINE!”)do(
端部
设置“项=%%I”
rem//提取`FileRef`和`/>`之间的字符串:
setlocal EnableDelayedExpansion
设置“ITEM=!ITEM:*FileRef=!”
设置“项目=!项目:/>=!”
rem//检查`FileRef`后的`=`-符号:
如果“!项:~,1!”==”(
rem//删除前导“=”和周围的“=”:
对于“(!ITEM:~1!”)中的/F“delims=| eol=|”%%F,请执行以下操作(
端部
设置“名称=%%~F”
rem//使用“?”作为分隔符组装返回字符串:
setlocal EnableDelayedExpansion
对于(“!COLL!!NAME!?”)中的/F“delims=| eol=|”%%J,请执行以下操作(
端部
设置“COLL=%%J”
setlocal EnableDelayedExpansion
)
)
)
)
端部
)
rem//返回集合变量:
setlocal EnableDelayedExpansion
回声(!COLL:~1,-1!
端部
端部
退出/B
进行切换是为了避免符号出现问题


在我看来,比在单个变量中收集所有值更好的方法是循环遍历它们。

这是另一种强制执行此操作的方法。此代码将每个FileRef放入其自己的变量中,并将变量名称按顺序排列

@echo off

FOR /F "delims=" %%G IN (line.txt) do set "line=%%G"

set i=0

:loop
set /a i+=1
set "line=%line:*FileRef=%"

FOR /F "tokens=1* delims==/" %%G IN ("%line%") DO (
    set "var%i%=%%~G"
    set "line=%%H"
)
echo "%line%"|find /I "fileref" >nul 2>&1 &&GOTO loop

set var
pause
当执行时,它将输出这个

C:\BatchFiles\SO\XML>bruteforce.bat
var1=A1-FS.elt
var2=A1-MS.elt
var3=Product\Product-v1\Product-v1-MD.elt
var4=Product\Product-v2\Product-v2-MD.elt
var5=RunnerPart_Assembly#1.elt
Press any key to continue . . .    

如果您不想将数据分配到各自的变量中,可以直接在
FOR
命令中使用
%%G
元变量。

这是另一种强制执行此操作的方法。此代码将每个FileRef放入自己的变量中,并对变量名进行排序

@echo off

FOR /F "delims=" %%G IN (line.txt) do set "line=%%G"

set i=0

:loop
set /a i+=1
set "line=%line:*FileRef=%"

FOR /F "tokens=1* delims==/" %%G IN ("%line%") DO (
    set "var%i%=%%~G"
    set "line=%%H"
)
echo "%line%"|find /I "fileref" >nul 2>&1 &&GOTO loop

set var
pause
当执行时,它将输出这个

C:\BatchFiles\SO\XML>bruteforce.bat
var1=A1-FS.elt
var2=A1-MS.elt
var3=Product\Product-v1\Product-v1-MD.elt
var4=Product\Product-v2\Product-v2-MD.elt
var5=RunnerPart_Assembly#1.elt
Press any key to continue . . .    

如果您不想将数据分配到各自的变量中,您可以直接在
FOR
命令中使用
%%G
元变量。

到目前为止您尝试了什么,哪里遇到了问题?您正在处理一个XML文件。使用一种本机支持读取和写入XML的语言。Jscript、Vbscript、,Powershell、Python等……是的,这很公平,但如果可能,我会将其保留在我的案例中,谢谢:)到目前为止,您尝试了什么,遇到了什么困难?您正在处理一个XML文件。使用一种本机支持读取和写入XML的语言。Jscript、Vbscript、Powershell、Python等……是的,这很公平,但如果可能,我会保留它,谢谢:)谢谢,我现在有些东西正在工作,我可以从中进一步发展:)谢谢,我现在有些东西正在工作,我可以从中进一步发展:)