The Difference Between Get-Member and .GetType() in PowerShell
Recently, I was helping someone in a forum who was trying to figure out what kind of object their command was returning. They knew about the standard cmdlets people suggest when you’re getting started (Get-Help, Get-Member, and Get-Command), but couldn’t figure out what was coming back from a specific command.
In order to make this a more generic example, and to simplify it, let’s approach this differently. Say I have these two objects where one is a string and the other is an array of two strings.
PS> $thing1 = 'This is an item'
PS> $thing2 = @('This is another item','This is one more item')
PS> $thing1; $thing2
The third line shows you what you get if you write these out to the screen.
This is an item
This is another item
This is one more item
It looks like three separate strings, right? Well we should be able to dissect these with Get-Member to get to the bottom of this and identify the types of objects these are. After all, one is a string and the other is an array, right?
PS> $thing1 | Get-Member
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
Clone Method System.Object Clone()
<output truncated>
So far, so good. $thing1 is our string, so we’d expect the TypeName to be System.String. Let’s check the array.
PS> $thing2 | Get-Member
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
Clone Method System.Object Clone()
<output truncated>
Dang, $thing2 is an array but Get-Member is still saying the TypeName is System.String. What’s going on?
Well, the key here is what we’re doing is writing the output of $thing2 into Get-Member. So the output of $thing2 is two strings, and that’s what’s actually hitting Get-Member. If we want to see what kind of object $thing2 really is, we need to use a method that’s built into every PowerShell object: GetType().
PS> $thing2.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
There you go. $thing2 is a System.Array object, just like we thought.
Get-Member is useful for exploring objects properties and methods, as well as their type. In this case, however, it was exploring the object that was being passed to it through the pipeline.