ragnacode
ragnacode

Reputation: 352

Powershell capturing group in pipeline select-object with calculated property

Given the following input XML sample -- assume multiple LogMessage entries.

<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>

I am using the following code to capture the values of attributes time, messageID, and capture a group in the 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

Output looks like:

time                    messageID Group     
----                    --------- ---------------     
2017-12-08 11:43:12.183 S6F1      @{2017120811431218=}

The @{ and } wrapping the captured group value is undesired. I am concerned about this particular use of the $Matches variable...I think what gets printed is a Match object and not the group string that it matched on... or something like this.

What is going on and how do I get the entries in the Group column appear as 2017120811431218 and not @{2017120811431218=}?

Upvotes: 1

Views: 613

Answers (1)

iRon
iRon

Reputation: 23673

The Match operator returns a boolean and populates the $Matches variable with the matching results.
In other words, you should void what is returned by the -Match operator (and not pipe it) and than simply return the $Matches['group'] to the Expression:

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

Upvotes: 3

Related Questions