Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.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 批处理文件中的子字符串_Batch File_Cmd - Fatal编程技术网

Batch file 批处理文件中的子字符串

Batch file 批处理文件中的子字符串,batch-file,cmd,Batch File,Cmd,我有一行xml代码: <P4PORT>facebook.com</P4PORT> facebook.com 如何获取最后一个标记中的值(facebook.com)。我以前是这样的: for /f "tokens=1" %%R in ('findstr /c:"<P4Port>" file.xml') do echo %%R PAUSE 对于('findstr/c:'file.xml')中的/f“tokens=1”%%R,执行echo%%R 暂停 但它给

我有一行xml代码:

<P4PORT>facebook.com</P4PORT>
facebook.com
如何获取最后一个
标记中的值(facebook.com)。我以前是这样的:

for /f "tokens=1" %%R in ('findstr /c:"<P4Port>" file.xml') do echo %%R
PAUSE
对于('findstr/c:'file.xml')中的/f“tokens=1”%%R,执行echo%%R
暂停

但它给了我整个字符串
facebook.com
。请说明如何使用批处理文件实现此目的。

使用带有vbscript的
RegExp

strData = "<P4PORT>facebook.com</P4PORT>"
With New RegExp
    .IgnoreCase = True
    .Pattern = "<P4PORT>((.|\n)*?)</P4PORT>"
    Set Matches = .Execute(strData)
End With
If Matches.Count > 0 Then strText = Matches(0).SubMatches(0)
wscript.echo strText
strData=“facebook.com”
使用新的RegExp
.IgnoreCase=True
.Pattern=“((.|\n)*?)”
设置匹配项=.Execute(strData)
以
如果Matches.Count>0,则strText=Matches(0)。子匹配(0)
wscript.echo strText

使用带有vbscript的
RegExp

strData = "<P4PORT>facebook.com</P4PORT>"
With New RegExp
    .IgnoreCase = True
    .Pattern = "<P4PORT>((.|\n)*?)</P4PORT>"
    Set Matches = .Execute(strData)
End With
If Matches.Count > 0 Then strText = Matches(0).SubMatches(0)
wscript.echo strText
strData=“facebook.com”
使用新的RegExp
.IgnoreCase=True
.Pattern=“((.|\n)*?)”
设置匹配项=.Execute(strData)
以
如果Matches.Count>0,则strText=Matches(0)。子匹配(0)
wscript.echo strText

最好将XML或任何其他结构化数据作为分层对象进行解析,而不是像复杂的文本那样进行破解和刮取。这样,您就不必依赖于数据的格式,不管它是美化的、缩小的还是其他的。最简单的解决方案是将其放入批处理脚本中:

for/f“delims=“%%I in”(
'powershell'([xml](gc filename.xml))。选择SingleNode('//P4PORT/text()')。数据“'
)是否设置“P4PORT=%%I”
回显%P4PORT%
如果您重视速度而不是简单性,那么也可以调用JScript来解析XML。使用.bat扩展名保存此批处理+JScript混合脚本

@如果(@code节==@Batch)@那么
@echo off和setlocal
对于/f“delims=”%%I in(
'cscript/nologo/e:JScript“%~f0”“filename.xml”'
)是否设置“P4PORT=%%I”
回显%P4PORT%
后藤:EOF
@结束//结束批处理/开始JScript混合代码
var xml=WSH.CreateObject('MSXML2.DOMDocument.6.0');
load(WSH.Arguments(0));
Echo(xml.selectSingleNode('//P4PORT/text()').data);

最好将XML或任何其他结构化数据作为分层对象进行解析,而不是像复杂的文本那样进行破解和刮取。这样,您就不必依赖于数据的格式,不管它是美化的、缩小的还是其他的。最简单的解决方案是将其放入批处理脚本中:

for/f“delims=“%%I in”(
'powershell'([xml](gc filename.xml))。选择SingleNode('//P4PORT/text()')。数据“'
)是否设置“P4PORT=%%I”
回显%P4PORT%
如果您重视速度而不是简单性,那么也可以调用JScript来解析XML。使用.bat扩展名保存此批处理+JScript混合脚本

@如果(@code节==@Batch)@那么
@echo off和setlocal
对于/f“delims=”%%I in(
'cscript/nologo/e:JScript“%~f0”“filename.xml”'
)是否设置“P4PORT=%%I”
回显%P4PORT%
后藤:EOF
@结束//结束批处理/开始JScript混合代码
var xml=WSH.CreateObject('MSXML2.DOMDocument.6.0');
load(WSH.Arguments(0));
Echo(xml.selectSingleNode('//P4PORT/text()').data);

这件事对我很有效,也是一个简单的解决方案。但是谢谢你的回答


对于/f“tokens=3 delims=><”%%a in('TYPE%connectionfile%^ | FIND”“'),请设置P4PORT=%%a

这件事对我很有效,也是一个简单的解决方案。但是谢谢你的回答


对于/f“tokens=3 delims=><”%%a in('TYPE%connectionfile%^ | FIND”“'),请设置P4PORT=%%a

也许您希望创建一个vbscript,用于查询XML(XPATH)中所需的值并将其打印出来。从后面的文件中,您可以使用for()loopTry
for/f“tokens=2 delims=“%%R in('findstr/L/I/C:“'file.xml“”)再次阅读此文件,设置“LAST=%%R”
,然后
echo(%LAST%
(假设文本行中没有前导空格)…可能需要创建一个查询xml的vbscript(XPATH)从后面的文件中,您可以使用for()loopTry
for/f“tokens=2 delims=“%%R in('findstr/L/I/C:“”file.xml“')再次读取此内容,设置“LAST=%%R”
,然后
回显(%LAST%
(假设文本行中没有前导空格)。。。