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
Batch file 使用批处理文件在xml标记之间复制文本_Batch File - Fatal编程技术网

Batch file 使用批处理文件在xml标记之间复制文本

Batch file 使用批处理文件在xml标记之间复制文本,batch-file,Batch File,我正在尝试创建一个批处理文件,该文件将读取两个不同XML标记之间的文本,并将值写入文本文件 XML看起来像: <JobInformation> <JOB> <JobName>17Jan_125thou_DEC_B_FullSheet</JobName> <Date>17 Jan 2017 11:24:34</Date> <CDI>192.168.0.29</CDI> <Circumference

我正在尝试创建一个批处理文件,该文件将读取两个不同XML标记之间的文本,并将值写入文本文件

XML看起来像:

<JobInformation>
<JOB>
<JobName>17Jan_125thou_DEC_B_FullSheet</JobName>
<Date>17 Jan 2017 11:24:34</Date>
<CDI>192.168.0.29</CDI>
<Circumference unit='mm'>1289.94mm</Circumference>
<Laser-Energy unit='J/sqcm'>3.2</Laser-Energy>
<XL-Workflow>XL125_45</XL-Workflow>
<Knife-Type>45 Degree</Knife-Type>
<PREVIEW-    IMAGE>"./images/17Jan_125thou_DEC_B_FullSheet/17Jan_125thou_DEC_B_FullSheet.jpg<    /PREVIEW-IMAGE>
</JOB>
<Plate>
<PlateName>DECx125_20115</PlateName>
<Type>PLATE</Type>
<PlateWidth unit='mm'>2032.0</PlateWidth>
<PlateHeight unit='mm'>1254.94</PlateHeight>
<TotalSize unit='sqm'>2.55</TotalSize>
<Waste unit='sqm'>0.285</Waste>
</Plate>
其输出为:

 DECx125_20115
 "17Jan_125thou_DEC_B_FullSheet.xml:&rem.PlateName&rem.DECx125_20115&rem.PlateName&rem."

更进一步,我如何编辑代码以只读取标记之间值的前几个字符?例如:在313719中(2017年3月30日16:50:17),我只想读313719。请参考

如果它总是以相同的方式格式化,您可以按以下更简单的方式进行:

@echo OFF

del output.txt

for /f "delims=<> tokens=3" %%i in ('findstr /i /c:"<PlateName>" *.xml') do (
echo %%i>>output.txt
)
for /f "delims=<> tokens=3" %%i in ('findstr /i /c:"<Waste" *.xml') do (
echo %%i>>output.txt
)
@echo关闭
del output.txt
对于('findstr/i/c:'*.xml')中的/f“delims=tokens=3”%%i(
echo%%i>>output.txt
)

对于/f“delims=tokens=3”%%i in('findstr/i/c:如果它总是以相同的方式格式化,您可以用一种简单得多的方式进行格式化,如下所示:

@echo OFF

del output.txt

for /f "delims=<> tokens=3" %%i in ('findstr /i /c:"<PlateName>" *.xml') do (
echo %%i>>output.txt
)
for /f "delims=<> tokens=3" %%i in ('findstr /i /c:"<Waste" *.xml') do (
echo %%i>>output.txt
)
@echo关闭
del output.txt
对于('findstr/i/c:'*.xml')中的/f“delims=tokens=3”%%i(
echo%%i>>output.txt
)

对于/f“delims=tokens=3”%%i in('findstr/i/c:“您的xml应该在末尾多加一个
标记。 实际上,您可以使用xpath解析xml以获取数据。请尝试以下脚本:

@if (@X)==(@Y) @end /* JScript comment
    @echo off


    cscript //E:JScript //nologo "%~f0" %*

    exit /b %errorlevel%

@if (@X)==(@Y) @end JScript comment */

var objDoc = WScript.CreateObject("MSXML.DOMDocument");
objDoc.load(WScript.Arguments.Item(0));

var objNode = objDoc.selectSingleNode("//"+WScript.Arguments.Item(1));
WScript.Echo(objNode.text);
你可以像这样使用它:

call getXMLText.bat "xml.xml" Waste
call getXMLText.bat "xml.xml" PlateName

您的xml应该在末尾多加一个
标记。 实际上,您可以使用xpath解析xml以获取数据。请尝试以下脚本:

@if (@X)==(@Y) @end /* JScript comment
    @echo off


    cscript //E:JScript //nologo "%~f0" %*

    exit /b %errorlevel%

@if (@X)==(@Y) @end JScript comment */

var objDoc = WScript.CreateObject("MSXML.DOMDocument");
objDoc.load(WScript.Arguments.Item(0));

var objNode = objDoc.selectSingleNode("//"+WScript.Arguments.Item(1));
WScript.Echo(objNode.text);
你可以像这样使用它:

call getXMLText.bat "xml.xml" Waste
call getXMLText.bat "xml.xml" PlateName

在单个
findstr
命令中使用正则表达式:

for /F "tokens=2,3 delims=<>" %%a in ('findstr "<PlateName>.*</PlateName> <Waste .*>.*</Waste>" *.txt') do (
    echo Found: %%a : %%b
)

你还写道:

此外,如果有任何其他方式比批量编程,请指导

从字面上说,还有其他更好的方法。 批处理文件在准确解析XML方面绝对是最差的


C++C#JavaPython,或者其他任何更好的方法。

在单个
findstr
命令中使用正则表达式:

for /F "tokens=2,3 delims=<>" %%a in ('findstr "<PlateName>.*</PlateName> <Waste .*>.*</Waste>" *.txt') do (
    echo Found: %%a : %%b
)

你还写道:

此外,如果有任何其他方式比批量编程,请指导

从字面上说,还有其他更好的方法。 批处理文件在准确解析XML方面绝对是最差的


C++C#JavaPython,或者其他更好的东西。

PowerShell内置了强大的XML解析功能-我强烈建议您使用它。在Google上的PowerShell中有很多关于解析XML的帖子。在第二个
findstr
命令l中有一个输入错误行:
findstr/i/c:“
--缺少
/c
选项。请在
:job2
和上一行之间插入
goto:eof
。您的代码正在搜索XML文件中未出现的文本字符串
;只有一部分
。@sharvillaval,您不会在注释中添加代码更新。编辑您的问题和rem请参阅您的评论。现在输出为DECx125_20115“17Jan_125000; u DEC_B_FullSheet.xml:&rem.Waste unit='sqm'&rem.0.285&rem.Waste&rem。”Vbscript、Jscript和Powershell都具有读取XML文件的本机功能。Powershell内置了强大的XML解析功能-我强烈建议您使用它。Google上有很多关于Powershell解析XML的帖子。第二个
findstr
命令行中有一个打字错误:
findstr/I/c:“
--缺少
/c
选项。请在
:job2
和上一行之间插入
goto:eof
。您的代码正在搜索XML文件中未出现的文本字符串
;只有一部分
。@sharvillaval,您不会在注释中添加代码更新。编辑您的问题和rem查看您的评论。现在输出为DECx125_20115“17Jan_125000; u DEC_B_FullSheet.xml:&rem.Waste unit='sqm'&rem.0.285&rem.Waste&rem.“Vbscript、Jscript和Powershell都具有读取xml文件的本机功能。您只需要一行。
for/f“delims=tokens=3”%G in('findstr/i/c:/c:“进一步说,我如何编辑代码以只读取标记之间值的前几个字符?例如:在313719中(2017年3月30日16:50:17),我只想读取313719。请指导您只需要一行。
对于/f“delims=tokens=3”%%G in('findstr/I/c:”“/c:“进一步说,我如何编辑代码以仅读取标记之间值的前几个字符?例如:在313719_V4_DSpotOrange(2017年3月30日16:50:17)中,我只想读取313719。请指导