As I'm reading in the PowerShell user guide, one of the core PowerShell concepts is that commands accept and return objects instead of text. So for example, running get-alias
returns me a number of System.Management.Automation.AliasInfo
objects:
PS Z:\> get-alias CommandType Name Definition ----------- ---- ---------- Alias % ForEach-Object Alias ? Where-Object Alias ac Add-Content Alias asnp Add-PSSnapIn Alias cat Get-Content Alias cd Set-Location Alias chdir Set-Location ...
Now, how do I get the count of these objects?
This will get you count:
get-alias | measure
You can work with the result as with object:
$m = get-alias | measure
$m.Count
And if you would like to have aliases in some variable also, you can use Tee-Object:
$m = get-alias | tee -Variable aliases | measure
$m.Count
$aliases
Some more info on Measure-Object cmdlet is on Technet.
Do not confuse it with Measure-Command cmdlet which is for time measuring. (again on Technet)
As short as @jumbo's answer is :-) you can do it even more tersely. This just returns the Count
property of the array returned by the antecedent sub-expression:
@(Get-Alias).Count
A couple points to note:
You can put an arbitrarily complex expression in place of Get-Alias, for example: @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count The initial at-sign (@) is necessary for a robust solution. As long as the answer is two or greater you will get an equivalent answer with or without the @, but when the answer is zero or one you will get no output unless you have the @ sign! (It forces the Count property to exist by forcing the output to be an array.)
2012.01.30 Update
The above is true for PowerShell V2. One of the new features of PowerShell V3 is that you do have a Count
property even for singletons, so the at-sign becomes unimportant for this scenario.
Set-StrictMode -Version Latest
is used. I just ran into this today (on 5.1) — something worked interactively that didn't work in a function. I tracked it down to the function have Set-StrictMode in it; when I set strict mode interactively, it didn't work, either.
Set-StrictMode
, too, so I should have noticed that.
if ($myObject.PSobject.Properties.Name -contains "count")
(from stackoverflow.com/questions/26997511/…) before trying to test the count property. I hate that PoSH makes me do this but Strict Mode is worth it.
Just use parenthesis and 'count'. This applies to Powershell v3
(get-alias).count
@($output).Count
does not always produce correct results. I used the ($output | Measure).Count
method.
I found this with VMware Get-VmQuestion cmdlet:
$output = Get-VmQuestion -VM vm1
@($output).Count
The answer it gave is one, whereas
$output
produced no output (the correct answer was 0 as produced with the Measure
method).
This only seemed to be the case with 0 and 1. Anything above 1 was correct with limited testing.
in my exchange the cmd-let you presented did not work, the answer was null, so I had to make a little correction and worked fine for me:
@(get-transportservice | get-messagetrackinglog -Resultsize unlimited -Start "MM/DD/AAAA HH:MM" -End "MM/DD/AAAA HH:MM" -recipients "user@domain.com" | where {$_.Event
ID -eq "DELIVER"}).count
@(...).Count
syntax.
Get-Alias|ForEach-Object {$myCount++};$myCount
158
Success story sharing
$Counter = $(get-alias | measure).Count
as it always returns the value 1 in case there's only one occurrence, just as you said.get-alias | measure | % { $_.Count }
measure
is short forMeasure-Object
; and returns a lot of other stuff -- likeAverage
,Sum
,Maximum
, etc...Get-Alias | Measure-Object | Select-Object -ExpandProperty Count
to get rid of%
and{}
. What is easier to write and read is for another discussion.