Get Properties of an Object in PowerShell without using Parentheses?

Table of Contents

I often find that I have to surround a command in parentheses and then use the property access operator (dot-notation) to get the value of a property. 

For example, If I have the following command and I want to get the Drives property, I will have to surround the whole command in parentheses first:

PS C:> Get-PSProvider FileSystem

Name                 Capabilities                                      Drives
----                 ------------                                      ------
FileSystem           Filter, ShouldProcess, Credentials                {C, D, P, Z}

PS C:> (Get-PSProvider FileSystem).Drives

Name           Used (GB)     Free (GB) Provider      Root                              
----           ---------     --------- --------      ----                              
C                 127.13         72.15 FileSystem    C:
D                  56.54        220.39 FileSystem    D:
P                 706.10       1341.90 FileSystem    P:
Z                   0.00      10240.00 FileSystem    \ExpanDrivee8psvd7c-1

This is rather annoying since I have to go back to the beginning of the line when I’d rather just keep typing where I am. It is especially annoying when I am in the middle of a larger set of piped commands.

Select Property vs ExpandProperty

If you run the following command, you will see that the output of command is actually an object.

PS C:\> Get-PSProvider FileSystem | Get-Member

   TypeName: System.Management.Automation.ProviderInfo

Name             MemberType Definition
----             ---------- ----------
Equals           Method     bool Equals(System.Object obj)
GetHashCode      Method     int GetHashCode()
GetType          Method     type GetType()
ToString         Method     string ToString()
Capabilities     Property   System.Management.Automation.Provider.Provider...
Description      Property   string Description {get;set;}
Drives           Property   System.Collections.ObjectModel.Collection
HelpFile         Property   string HelpFile {get;}
Home             Property   string Home {get;set;}
ImplementingType Property   type ImplementingType {get;}
Module           Property   psmoduleinfo Module {get;}
ModuleName       Property   string ModuleName {get;}
Name             Property   string Name {get;}
PSSnapIn         Property   System.Management.Automation.PSSnapInInfo...

You can use Select-Object -ExpandProperty <property name>. This can be shortened using the alias select and only typing part of the property name:

Get-PSProvider FileSystem | select -ExpandProperty Drives

#Get-PSProvider FileSystem | select -exp Drives
Name           Used (GB)     Free (GB) Provider      Root                              
----           ---------     --------- --------      ----                              
C                 127.13         72.15 FileSystem    C:\
D                  56.54        220.39 FileSystem    D:\
P                 706.10       1341.90 FileSystem    P:\
Z                   0.00      10240.00 FileSystem    \\ExpanDrive\e8psvd7c-1

But what if you want to pipe the output of Get-PSProvider command into another cmdlet which is expecting a string data type as an input instead of an object? Well, in that case you need to use -ExpandProperty parameter instead of -Property as shown below:

PS C:\>  Get-PSProvider FileSystem | select -exp Drives | select -exp Name | Get-Member

   TypeName: System.String

Name             MemberType            Definition
----             ----------            ----------
Clone            Method                System.Object Clone(), System.Object ICloneable.Clone()
...

The -ExpandProperty is particularly useful when the other cmdlet down the pipeline is expecting a string data type instead of object. The command also shows that there are a whole lot of different methods that you can perform on a string data type that were not possible on an object.

PS C:\>  Get-PSProvider FileSystem | select -ExpandProperty Drives | select -ExpandProperty Name
C
D
P
Z

So, in the end, use of -Property and -ExpandProperty parameters really depend upon what you want to do with the output.

Leave a Comment

Required fields are marked *