鉴于以下输入 XML示例 - 假设有多个LogMessage条目。
<LogMessages>
<LogMessage time="2017-12-08 11:44:05.202" messageID="A10">
<![CDATA[Long non-xml string here containing <TS "2017120811431218"> somewhere in the body"]>
</LogMessage>
</LogMessages>
我使用以下代码捕获属性 time , messageID 的值,并捕获CDATA中的组。
[xml]$xml = Get-Content input.xml
$xml.LogMessages.LogMessage | Where-Object {$_.messageID -eq "A10"} | Select-Object -Property time,messageID,@{Name="A10Timestamp"; Expression=$_."#cdata-section" -match '<TS "(?<group>[0-9]{16})">' | Select-Object $Matches['group'] }} `
| Export-Csv output.csv -NoTypeInformation
输出如下所示:
time messageID Group
---- --------- ---------------
2017-12-08 11:43:12.183 S6F1 @{2017120811431218=}
包含捕获的组值的@ {和}是不受欢迎的。我担心$ Matches变量的这种特殊用法...我认为打印的是Match对象,而不是它匹配的组字符串......或类似的东西。
发生了什么以及如何获取组列中的条目显示为 2017120811431218 而不是 @ {2017120811431218 =} ?
答案 0 :(得分:1)
Match
运算符返回一个布尔值,并使用匹配结果填充$Matches
变量。
换句话说,您应该使-Match
运算符返回的内容无效(并且不管道它),而只是将$Matches['group']
返回到Expression
:
Expression={$Void = $_."#cdata-section" -match '<TS "(?<group>[0-9]{16})">'; $Matches['group']}