PowerShell tips for sysadmins: How to format objects with Calculated Properties

smiling man
Adam Ruth|July 28, 2010
Generic blog header
Generic blog header
Sections
    No Data

    In a previous post I went over three cmdlets for formatting data. Each of those cmdlets let you select which object properties you want to show. You aren't just limited to the existing properties on the objects, though, you can use Calculated Properties which let you format the properties in any way you like. The syntax for calculated properties looks a little odd at first, but it's actually quite simple.

    For example, this expression displays the time between the creation and last write times of files:

    screen shot 2010-07-16 at 8.36.15 am

    There are a few things here that need explaining:

    • The back-tick at the end of the first line allows you to type in commands on multiple lines, making it easier to read and write long commands.

    • Calculated properties are defined as Hash Tables, which are simple name/value containers. They are created by putting the names and values inside of @{} separated by semicolons.

    • Calculated properties require that the hash table has two values: Name and Expression.

    • The Expression value in the hash table is itself enclosed in curly braces {} which is the way you pass PowerShell script code as a property to a cmdlet.

    • The value $_ inside of the Expression is the object that is being formatted. In the above example it is referenced twice to pull out the two properties CreationTime and LastWriteTime.

    • CreationTime and LastWriteTime are .NET objects called DateTime and they have a number of properties and actions themselves. The example uses the Subtract method which gives the difference between two DateTime objects.

    • The object returned from the Subtract method is called a TimeSpan. It displays as

      days.hours:minutes:seconds.milliseconds.

       It also has a number of properties to get these values individually.

    As you can see, showing a TimeSpan like that is not the easiest to read. We can display just the days like this:

    screen shot 2010-07-16 at 8.57.06 am

    One PowerShell construct that is very helpful when formatting output is the -f operator. This takes text with embedded placeholders in it and replaces them with formatted values. A simple example:

    screen shot 2010-07-16 at 9.07.16 am

    There are two placeholders which insert the two values (placeholder numbering starts with 0.) Not only can the -f operator insert the given values, but it can also format numbers in a variety of ways. Consider this example:

    screen shot 2010-07-16 at 9.13.09 am

    This example shows the size of each file in megabytes, formatted out to two decimal places. It starts by dividing the Length of the file by 1Mb (which is a built-in PowerShell value handy when dealing with file sizes along with 1kb, 1gb, and 1tb.) This value is then passed to a format placeholder {0:0.00}. The text after the colon defines how the number is to be displayed. In this case, it will show one at least one digit to the left and no more than 2 digits to the right of the decimal. There are many different types of formatting rules you can use, here's Microsoft's documentation for more details.

    Once you understand the basics of Calculated Properties, there really isn't any limit to how values can be formatted. Calculated properties aren't just for making output easy to read, but they come in very handy when you need to pass the output of some command to a program that expects things to be in a specific format. Consider using them any time you have to massage data manually.


    Need help with PowerShell? Post a question in ourdiscussion forums and get an answer quick.

    smiling man
    Adam Ruth

    Adam is a co-founders of PDQ.

    Related articles