During the Scripting Games I found myself creating a lot of custom objects with properties that I could use to sort , select, take averages of, and a number of other cool things. Getting results into a Powershell object can make life a lot easier for a number of reasons.
There was one little piece I was missing. Not only did I want to create a single object, quite often I would want to put all the objects I created into a collection of objects. Did you know you can add collections of like objects to each other ?
1: PS 13 > $a = get-process
2: PS 14 > $a.count
3: 66
4: PS 15 > $b = get-process
5: PS 16 > $c = $a + $b
6: PS 17 > $c.count
7: 131
8: PS 18 >
The code above shows that I can add two collections of process objects together. Very cool.
So I tried doing this in the scripting games and came across a problem. For instance, in Event 3 we needed to tally up a bunch of votes. So what I really needed was to create a bunch of $vote objects and put them all together in a collection called $votes
Here's what I came up with at first.
By the way, when I create PS Custom Objects I cheat and use the "" | Select-Object prop1, prop2 nomenclature. My easier than using new-object followed by a bunch of add-member commands.
1: $votes = "" | Select-Object v1,v2,v3,v4
2: foreach ($v in Get-Content votes.txt)
3: {
4: $vote = "" | Select-Object v1,v2,v3,v4;
5: $vote.v1,$vote.v2,$vote.v3,$vote.v4 = $v.split(",")
6: $votes += $vote
7: }
Looks nice and shiny until you run it :) I get the following error:
Method invocation failed because [System.Management.Automation.PSObject] doesn't contain a method named 'op_Addition'.
Not so shiny
The trick is that we $votes needs to be a collection of $vote objects, not another object identical to $vote.
So we instantiate $votes with a cast to [array] and life is good.
1: $votes = @()
2: foreach ($v in Get-Content votes.txt)
3: {
4: $vote = "" | Select-Object v1,v2,v3,v4;
5: $vote.v1,$vote.v2,$vote.v3,$vote.v4 = $v.split(",")
6: $votes = $votes + $vote
7: }
A quick update, thanks to Aleksandar. We should instantiate $votes as $votes = @(). I have updated the example above.