Skip to main content

Using Calculated Properties with Select-Object

From time to time, I take a good look at how I am teaching PowerShell just to make sure that I am providing the most effective delivery.  That may be why when someone audits the class, they say they learn new material.  Besides, if I did not make changes, I would get bored.

Over the last few months I’ve been teaching how to create calculated properties with Select-Object a little differently.  This is a key skill to have so I need to make sure that we get it right.  Here is an explanation of how to create a custom property.

A custom property simply adds an additional property to an object in the PowerShell pipeline.  It does not change the original object, just the copy of it in the pipeline. Take a look at the properties of Get-Date.
PS C:\> Get-date | Select *


DisplayHint : DateTime
DateTime    : Thursday, February 11, 2016 7:46:10 PM
Date        : 2/11/2016 12:00:00 AM
Day         : 11
DayOfWeek   : Thursday
DayOfYear   : 42
Hour        : 19
Kind        : Local
Millisecond : 564
Minute      : 46
Month       : 2
Second      : 10
Ticks       : 635908167705642214
TimeOfDay   : 19:46:10.5642214
Year        : 2016

We are going to add a new property called OurDate. This new property will have a value consisting of the current year, month, and day in this format: YYYY-MM-DD.  Here is the code to accomplish this:
Get-Date |
    Select-Object -Property *,
    @{
        Name="OurDate";
        Expression={"$($_.Year)-$($_.Month)-$($_.Day)"}
    }

We first place a DateTime object into the pipeline by calling Get-Date. Next we pipe it to Select-Object.  We use the –Property parameter to select which properties to keep from the original object.  In this case, we use ‘*’ to keep all of them.  Next we add a second property.  This one is a hash table.
A hash table is a key/value pair.  In our case, a Property Name / Property Value pair.  Hash tables in PowerShell are denoted by @{}.  Inside of the curly braces is where we declare the property name and the property value.

The Name value provides us with the property name.  You can see that we set this value equal to a string of what we want to call this new calculated property, “OurDate”.

The Expression is the calculated part.  The actual calculation is done inside of its own set of curly braces ‘{}’. While calculating this property, you can reference the current object in the PowerShell pipeline by using one of two generic variables.  $_ is usable in all versions of PowerShell.  $PSItem is for PowerShell 3 and higher.  They both represent the current object in the PowerShell pipeline.  Because this variable represents the object, you have access to all the properties and methods of the object. In our example, we are creating a string that contains the values of 3 properties from the object in the pipeline.  Since we are creating this value as a string, each time we reference the object, we need to place it inside of a subexpression.  That would be the $() surrounding each call to the object.  Here is the end result.

DisplayHint : DateTime
DateTime    : Thursday, February 11, 2016 8:56:23 PM
Date        : 2/11/2016 12:00:00 AM
Day         : 11
DayOfWeek   : Thursday
DayOfYear   : 42
Hour        : 20
Kind        : Local
Millisecond : 151
Minute      : 56
Month       : 2
Second      : 23
Ticks       : 635908209831513532
TimeOfDay   : 20:56:23.1513532
Year        : 2016
OurDate     : 2016-2-11

Take a look at the last item.  It is our calculated property.
You can shorten this code up a bit:
Get-Date |
    Select-Object -Property *,
    @{
        N="OurDate";
        E={"$($_.Year)-$($_.Month)-$($_.Day)"}
    }

Or
Get-Date |
    Select-Object -Property *,
    @{N="OurDate" ; E={"$($_.Year)-$($_.Month)-$($_.Day)"}}

You can also look at the examples in the help file for Select-Object. Take a look at example #4 for another example of creating a calculated property.



Comments

Popular posts from this blog

Adding a Comment to a GPO with PowerShell

As I'm writing this article, I'm also writing a customization for a PowerShell course I'm teaching next week in Phoenix.  This customization deals with Group Policy and PowerShell.  For those of you who attend my classes may already know this, but I sit their and try to ask the questions to myself that others may ask as I present the material.  I finished up my customization a few hours ago and then I realized that I did not add in how to put a comment on a GPO.  This is a feature that many Group Policy Administrators may not be aware of. This past summer I attended a presentation at TechEd on Group Policy.  One organization in the crowd had over 5,000 Group Policies.  In an environment like that, the comment section can be priceless.  I always like to write in the comment section why I created the policy so I know its purpose next week after I've completed 50 other tasks and can't remember what I did 5 minutes ago. In the Group Policy module for PowerShell V3, th

Return duplicate values from a collection with PowerShell

If you have a collection of objects and you want to remove any duplicate items, it is fairly simple. # Create a collection with duplicate values $Set1 = 1 , 1 , 2 , 2 , 3 , 4 , 5 , 6 , 7 , 1 , 2   # Remove the duplicate values. $Set1 | Select-Object -Unique 1 2 3 4 5 6 7 What if you want only the duplicate values and nothing else? # Create a collection with duplicate values $Set1 = 1 , 1 , 2 , 2 , 3 , 4 , 5 , 6 , 7 , 1 , 2   #Create a second collection with duplicate values removed. $Set2 = $Set1 | Select-Object -Unique   # Return only the duplicate values. ( Compare-Object -ReferenceObject $Set2 -DifferenceObject $Set1 ) . InputObject | Select-Object – Unique 1 2 This works with objects as well as numbers.  The first command creates a collection with 2 duplicates of both 1 and 2.   The second command creates another collection with the duplicates filtered out.  The Compare-Object cmdlet will first find items that are diffe

How to list all the AD LDS instances on a server

AD LDS allows you to provide directory services to applications that are free of the confines of Active Directory.  To list all the AD LDS instances on a server, follow this procedure: Log into the server in question Open a command prompt. Type dsdbutil and press Enter Type List Instances and press Enter . You will receive a list of the instance name, both the LDAP and SSL port numbers, the location of the database, and its status.