我有一个xml文件,我需要只读取主字符串中的特定子字符串。 xml文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<Report Version="10.0">
<Entities>
<Entity Name="\\sharing\Data\SB\**appname**\wcf\Utilitysvc\bin\svcUtility.Host.dll">
<Mods>
<Mod Name="svcUtility.Host.dll" AssemblyVersion="1.0.2000.001">
<Fields>
<Field Name="TIndex" Value="100" />
<Field Name="Vindex" Value="200" />
</Fields>
</Mod>
</Mods>
</Entity>
</Entities>
</Report>
此xml中的主要字符串是 -
<Entity Name="\\sharing\Data\SB\**appname**\wcf\Utilitysvc\bin\svcUtility.Host.dll">
我需要只打印“appname”。
我可以使用什么条件逻辑在powershell中使用正则表达式打印它?并且在appname之后总是不需要\ wcf ..它可以是基于dll路径的任何东西。对于Eg,它可以像:
<Entity Name="\\sharing\Data\*SB*\**appname**\**Web**\Utilitysvc\bin\svcUtility.Host.dll">
或
<Entity Name="\\sharing\Data\*SB*\*DEVCS*\**appname**\**junk**\Utilitysvc\bin\svcUtility.Host.dll">
我可以使用通用的select -string方式吗? 还需要对此进行测试..
谢谢,
阿希什
答案 0 :(得分:2)
这是一种方式:
$xml = [xml](get-content .\my.xlm )
($xml.Report.Entities.Entity.name |
% { [regex]::matches($_, 'SB\\(.*)\\wcf') } |
select -expand groups)[1].value
没有[regex] .net方法:
($xml.Report.Entities.Entity.name |
select-string 'SB\\(.*)\\wcf' -AllMatches | select -ExpandProperty matches |
select -ExpandProperty groups)[1].value
编辑:
根据您的上一条评论尝试此模式:
($xml.Report.Entities.Entity.name |
select-string '(?<=\\Data\\.*\\)[^\\]*' -AllMatches |
select -ExpandProperty matches |
select -ExpandProperty groups)[0].value
答案 1 :(得分:0)
你可以在没有正则表达式的复杂性的情况下做到这一点,拆分路径并抓住第5个元素(听起来像电影名称):
[xml]$xml = @"
<?xml version="1.0" encoding="utf-8"?>
<Report Version="10.0">
<Entities>
<Entity Name="\\sharing\Data\SB\**appname**\wcf\Utilitysvc\bin\svcUtility.Host.dll">
<Mods>
<Mod Name="svcUtility.Host.dll" AssemblyVersion="1.0.2000.001">
<Fields>
<Field Name="TIndex" Value="100" />
<Field Name="Vindex" Value="200" />
</Fields>
</Mod>
</Mods>
</Entity>
</Entities>
</Report>
"@
$xml.Report.Entities.Entity.Name.split('\')[5]
**appname**