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

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.

How to run GPResult on a remote client with PowerShell

In the past, to run the GPResult command, you would need to either physically visit this client, have the user do it, or use and RDP connection.  In all cases, this will disrupt the user.  First, you need PowerShell remoting enabled on the target machine.  You can do this via Group Policy . Open PowerShell and type this command. Invoke-Command –ScriptBlock {GPResult /r} –ComputerName <ComputerName> Replace <ComputerName> with the name of the target.  Remember, the target needs to be online and accessible to you.

Error icon when creating a GPO Preference drive map

You may not have an error at all.  Take a look at the drive mapping below. The red triangle is what threw us off.  It is not an error.  It is simply a color representation of the Replace option of the Action field in the properties of the drive mappings. Create action This give you a green triangle. The Create action creates a new mapped drive for users. Replace Action The Replace action gives you a red triangle.  This action will delete and recreate mapped drives for users. The net result of the Replace action is to overwrite all existing settings associated with the mapped drive. If the drive mapping does not exist, then the Replace action creates a new drive mapping. Update Action The Update action will have a yellow triangle. Update will modify settings of an existing mapped drive for users. This action differs from Replace in that it only updates settings defined within the preference item. All other settings remain as configured on the mapped drive. If the