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 \\ExpanDrive\e8psvd7c-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.
Not a reader? Watch this related video tutorial: