views:

45

answers:

1

I'm trying to parse a file that contains blocks of text in this format(there can be 1-n of these):

-----------------------------------------------------------
KB Article Number(s): 2028769, 2072493, 2120979, 2143880, 2163958, 2163980, 980653, 980883, 981155, 981867, 982321, 982850
Language: All (Global)
Platform: x64
Location: (http://foo.bar.com)
Password: foo
-----------------------------------------------------------

The text is coming from an MS Hotfix request email if anyone is interested.

I have the following powershell one liner:

 $file | select-string "(?<Name>\w+):(?<Value>.*)" -allmatches | SELECT @{N="Name";E={$_.Matches[0].Groups[1].Value}}, @{N="Value";E={$_.Matches[0].Groups[2].Value}}

This give me a flat set of name value pairs, I would like it to return an array of hashtables with each of the 5 Keys populated.

I'm not sure if the problem is my regex or how I'm accessing the matches (There must be a less verbose way of picking these out).

+2  A: 

It's not pretty but I think it will work for you:

$ht = @{}
$file | %{if ($_ -match '(?<Name>[^:]+):(?<Value>.*)') {
          $ht.($matches.Name) = $matches.Value.Trim()} `
          elseif ($ht.Count) {$ht;$ht.Clear()}}

Using the -match operator is a tad easier because you can use the $matches variable directly without having to go through Select-String's MatchInfo.Matches property. BTW I'm assuming here $file was populated by a call to Get-Content i.e. each line is a string in a string array.

Keith Hill
Sorry for the delay Keith, Thanks for the answer. I was off down another rathole for awhile 8)
JasonHorner