I came across a small issue with a little helper script I wrote to count vSphere objects using PowerCLI this morning. It’s been a couple of a weeks since I last did a blog post – things have been very busy, so I have not been able to commit much time over the last few weeks to blogging. As such, I thought I would do a quick post around this small issue I came across earlier. It has more than likely been covered off elsewhere, but will be a good reference point to come back to if I ever forget!
So to the issue I saw. Essentially, if an object count is 1 or less, then the object is returned as the object type itself. For example, where only one Distributed Virtual Switch exists in a vSphere environment, and we use the cmdlet, Get-VirtualSwitch -Distributed, a single object is returned of BaseType “VMware.VimAutomation.ViCore.Impl.V1.VIObjectImpl“.
However, if we had more than one dvSwitch, then we would get a BaseType of “System.Array” returned.
We are able to use the Count() method on an array with PowerShell version 2.0, but are not able to use the Count() method on a single object. The work around I found here (when using PowerShell 2.0) is to cast the object type specifically as an array.
So in the case of our dvSwitch example above, originally we would have done:
@dvSwitchCount = (Get-VirtualSwitch -Distributed).Count
To cast this as an array, and therefore having an accurate count of the objects, whether there are no members, one member, or more, we would use:
@dvSwitchCount = @(Get-VirtualSwitch -Distributed).Count
Note the addition of the “@” sign – used to cast the variable as an array.
Jonathan Medd also kindly pointed out that this is fixed with PowerShell 3.0 – have a read of the new features to see the addition that allows .Count to be used on any type of object over here.