Powershell捕获具有计算属性的管道选择对象中的组

时间:2017-12-15 13:39:02

标签: powershell

鉴于以下输入 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 =}

1 个答案:

答案 0 :(得分:1)

Match运算符返回一个布尔值,并使用匹配结果填充$Matches变量。
换句话说,您应该使-Match运算符返回的内容无效(并且不管道它),而只是将$Matches['group']返回到Expression

Expression={$Void = $_."#cdata-section" -match '<TS "(?<group>[0-9]{16})">'; $Matches['group']}