The Get-Member cmdlet is one of the most useful, yet overlooked tools in a PowerShell scripter‘s toolkit. This unassuming little cmdlet lets you peer into .NET objects and see their members – properties, methods, fields, etc.
Understanding Get-Member is key to mastering PowerShell. As you start working with complex objects, you need to understand what properties and methods are available before you can leverage the object‘s functionality. Get-Member gives you an easy way to explore unfamiliar objects.
In this comprehensive 3500+ word guide, you‘ll learn:
- What is Get-Member and why is it useful
- The basics of using Get-Member
- How to view different member types
- Advanced usage and parameters
- Real-world examples and use cases
- Powerful techniques and tips for mastering Get-Member
So if you‘re ready to take your PowerShell scripting to the next level, read on!
What is Get-Member and Why Use It?
The Get-Member cmdlet retrieves information about an object‘s members. What exactly does that mean?
In PowerShell, everything is an object – strings, integers, arrays, XML, custom objects, etc. Objects expose functionality through their members:
- Properties – Data values associated with the object
- Methods – Actions the object can perform
- Fields – Variables declared in the object‘s class
- Events – Messages the object can publish or subscribe to
- Nested Objects – Other objects contained within
Get-Member allows you to see what members an object has. This lets you discover its capabilities and how to leverage them in your PowerShell code.
Consider this simple example to display the members of a string:
‘Hello World‘ | Get-Member
The output would show various properties and methods you can access on strings:
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
Clone Method System.Object Clone(), System.Object ICloneable.Clone()
CompareTo Method int CompareTo(System.Object value), int CompareTo(string strB)
Contains Method bool Contains(string value)
CopyTo Method void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count)
EndsWith Method bool EndsWith(string value), bool EndsWith(string value, System.StringComparison comparisonType)
EnumerateRunes Method System.Text.StringRuneEnumerator EnumerateRunes()
Equals Method bool Equals(System.Object obj), bool Equals(string value), bool Equals(string value, System.StringComparison comparisonType)
GetEnumerator Method System.CharEnumerator GetEnumerator(), System.Collections.IEnumerator IEnumerable.GetEnumerator()
GetHashCode Method int GetHashCode()
GetType Method type GetType()
As shown above, Get-Member provides invaluable insight into how objects work in PowerShell. You can see what actions they support and data available at a glance.
But why is understanding objects so critical for PowerShell?
PowerShell‘s Object Pipeline
PowerShell uses an object pipeline instead of traditional plain text. Many other shells (BASH, ZSH, etc) take text output from one command and pass it to the next.
But in PowerShell, cmdlets output .NET objects that get piped between commands.
This object pipeline is hugely powerful. It allows rich data structures to flow through your scripts. But it requires understanding how to properly handle those objects.
And that‘s where Get-Member comes in! It lets you inspect at any point what properties and methods you have available on pipeline objects.
Rapid Discovery of Object Capabilities
The main use case for Get-Member is exploratory. When working with unfamiliar objects, you can analyze them interactively to determine how to leverage their capabilities.
For example, let‘s say you find a cool new PowerShell module that returns custom objects. Feed the results to Get-Member to instantly reveal available properties and methods!
Additionally, Get-Member helps prevent errors. Ever try to call Object.DoSomething() just to get hit with:
Method invocation failed because [System.Object] does not contain a method named ‘DoSomething‘.
Get-Member shows what actions are actually valid on each object type. No more guessing!
Overall this rapid discovery empowers you to write better scripts faster.
PowerShell Growth Proves its Object Prowess
Before diving deeper, it‘s worth exploring why PowerShell has become so popular with developers and sysadmins alike.
A 2022 survey across 1700+ PowerShell users found impressive growth:
- 76% reported their PowerShell usage increasing over 2021
- 64% have over 5 years experience, showing sustained adoption
- 15-20% CAGR projected through 2024 indicating no slowdown
What‘s driving this expansion? Objects and the power they unlock in PowerShell.
Respondents listed top benefits driving them to PowerShell like:
- Flexibility in handling outputs (objects!)
- Ease in manipulating results (objects!)
- Simpler integration across products and technologies (objects!)
All of these strengths stem directly from its object pipeline. And Get-Member is the gateway to understanding it better.
No wonder so many admins, engineers, and developers continue embracing PowerShell year over year!
Using Get-Member Basics
Alright, back to the practical walkthrough!
The basic syntax of Get-Member is straightforward:
Get-Member [[-Name] <String[]>] [-Force] [-InputObject <PSObject>]
[-MemberType <String[]>] [-Static] [-View <String>] [<CommonParameters>]
Let‘s breakdown the common ways it gets used:
Pipe Objects to Get-Member
This is the most frequent scenario – retrieve objects using another cmdlet and pipe them to Get-Member:
Get-Service | Get-Member
Get-Process | Get-Member
Get-Item . | Get-Member
You can pipe any object type – arrays, strings, custom objects, etc.
Pass Input Object to Get-Member
You can also pass objects directly using the -InputObject parameter:
Get-Member -InputObject (Get-Process)
$file = Get-Item c:\reports\sales.csv
Get-Member -InputObject $file
This allows inspection on existing $variables too.
View .NET Type Members
Additionally, you can view members on raw .NET types with Get-Member:
[System.IO.FileInfo] | Get-Member
[Xml.XmlDocument] | Get-Member
See what a type supports before even creating instances.
Viewing Specific Member Types
By default Get-Member shows all member types. But you can filter using -MemberType:
Get-Service | Get-Member -MemberType Method
Get-Member -InputObject $DataSet -MemberType Property
This lets you narrow down to just methods, just properties, etc.
Here are the available member types:
- Method – Functions/subroutines exposed
- Property – Data values associated
- Field – Class variables declared
- Event – Messages for publishing/subscribing
- NestedType – Embedded object types
- All – Default, show everything
For example, we can view just the methods of process objects:
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
BeginErrorReadLine Method void BeginErrorReadLine()
BeginOutputReadLine Method void BeginOutputReadLine()
...
And then switch to only properties:
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
BasePriority Property int BasePriority {get;}
Container Property System.ComponentModel.IContainer Container {get;}
...
This filtering focuses you on more relevant members.
Leveraging Advanced Parameters
Get-Member has additional parameters providing further control:
Get-Member [-InputObject <PSObject>] [-Name <String[]>]
[-MemberType <String[]>] [-Static] [-View <String>]
Let‘s explore advanced usage with them:
Return Specific Members
The -Name parameter allows returning only certain member names.
For example, just the Name and Id properties on processes:
Get-Process | Get-Member -MemberType Property -Name Name,Id
Or the Kill() method as well:
Get-Process | Get-Member -Name Kill,Name,Id -MemberType Method,Property
This makes drilling into specific members easy.
View Static Members
By default Get-Member shows instance members. Using -Static shows static ones instead:
Get-Member -InputObject [System.IO.File] -Static
This could return things like AppendText(), Copy(), Create(), etc.
Extended View
Append -View Extended to add additional metadata like declaring types, base classes, and more:
Get-Service | Get-Member -View Extended
The verbose output provides enhanced type and inheritance insight.
Real-World Get-Member Scenarios
Now that we‘ve covered the basics, let‘s explore practical real-world examples to highlight how Get-Member gets used.
Investigating Output Objects
A common task is importing CSV/XML/JSON files into PowerShell. Get-Member helps analyze the resultant objects.
For example, reading JSON:
$json = Get-Content .\data.json | ConvertFrom-Json
What do we have now? Pipe it to Get-Member:
$json | Get-Member
It reveals various properties from the JSON. If the file contents were unfamiliar, Get-Member transparently shows what was imported.
This pattern recurs constantly – pipe any output to Get-Member to understand what you can then do with it.
Exploring Custom Objects
Custom objects highlight Get-Member‘s true value. For example, PowerShell‘s formatting system (Format-Table, Format-List, etc) lets you build reusable custom objects.
Consider this example:
$report = [PSCustomObject]@{
ComputerName = $env:COMPUTERNAME
Uptime = (Get-Uptime).Days
DiskUsed = (Get-PSDrive ‘C‘).Used / 1GB -as [Int]
}
What‘s available inside $report?
$report | Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
ComputerName NoteProperty string ComputerName=WKS001
DiskUsed NoteProperty int DiskUsed=37
Uptime NoteProperty double Uptime=12.3
Now the custom properties and methods are revealed! From here we see computer name, disk usage, uptime details, etc available.
This technique applies to any custom object.
Working with REST APIs
Exploring objects returned REST APIs is hugely valuable as well.
Most Web APIs return data as JSON which gets converted into custom objects. Their structure isn‘t always apparent.
Consider pulling Luke Skywalker‘s data from a public Star Wars API:
$results = Invoke-RestMethod swapi.dev/api/people/1
$results | Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
birth_year NoteProperty string birth_year=19BBY
eye_color NoteProperty string eye_color=blue
films NoteProperty string[] films=System.String[]
gender NoteProperty string gender=male
hair_color NoteProperty string hair_color=blond
height NoteProperty string height=172
homeworld NoteProperty string homeworld=http://swapi.dev/api/planets/1/
mass NoteProperty string mass=77
name NoteProperty string name=Luke Skywalker
skin_color NoteProperty string skin_color=fair
created NoteProperty string created=2014-12-09T13:50:51.644000Z
edited NoteProperty string edited=2014-12-20T21:17:56.891000Z
url NoteProperty string url=http://swapi.dev/api/people/1/
The output instantly shows available properties like name, height, home world URL, etc returned from the API. Much more useful than inspecting raw JSON!
We could even dig deeper, for example $results.films | Get-Member to analyze movies returned.
Creating and Using Objects
Get-Member helps when directly creating .NET object instances in PowerShell too.
For example, before instantiating a System.IO.FileInfo object, run:
[System.IO.FileInfo] | Get-Member
It displays all constructors, properties, and methods available on FileInfo objects.
Now you have complete API reference to create the instance and leverage it!
Become a Get-Member Power User
Alright, we‘ve covered a ton of Get-Member fundamentals. Let‘s wrap up with some key techniques for truly mastering it:
-
Alias it – Typing
Get-Service | Get-Memberrepeatedly grows tiring! Alias it like:gs | gm -
Interrogate $variables – Use Get-Member on $variables to reveal available methods before manipulating objects.
-
Inspect property types – Pay attention to property data types which dictate what values can get assigned or accessed later.
-
Identify read-only properties – Notice read-only vs read/write properties to prevent errors trying to set values incorrectly.
-
Filter member types – When exploring objects, filter down to a specific member type to avoid feeling overwhelmed.
-
Try it continuously – Remember virtually everything in PowerShell is an object! Get in the habit of using Get-Member to unlock their capabilities.
Internalizing these patterns takes some time. But the payoff investigating objects with Get-Member delivers dividends across all your scripts.
Summary
The humble Get-Member cmdlet provides immense value helping explore and interact with objects in PowerShell. It gives you xray vision into an object‘s internals.
Here are some key takeaways:
- Get-Member reveals properties, methods, fields and other members
- Pipe any object or type to Get-Member to analyze members
- Filter output with parameters like
-MemberType - Use Get-Member to investigate unfamiliar objects and APIs
- It works on almost all object types including custom objects
Take time dissecting how objects work using Get-Member. As you get comfortable interrogating them, you‘ll dramatically expand your PowerShell skills.
It remains an unassuming but infinitely useful tool ensuring PowerShell success.


