Advanced Windows PowerShell Scripting Video Training

Advanced Windows PowerShell Scripting Video Training
Advanced Windows PowerShell Scripting Video Training

Tuesday, July 12, 2016

What is the Difference between $PSItem and $PSItem.Something?

Diversity is a wonderful thing.  So many different experiences leads us to look at the same thing in so many different ways.  I just had a simple, yet really good question in my PowerShell class.
“What is the difference between $PSItem and $PSItem.something?”

Good question.  We are currently studying the PowerShell Pipeline.  As a result, we are looking at $_ and $PSItem.  These two automatic variables represent the current object in the PowerShell pipeline.  If you look at the PowerShell help file About_Automatic_Variables you will see this:
       Same as $PSItem. Contains the current object in the pipeline object.
       You can use this variable in commands that perform an action on every
       object or on selected objects in a pipeline.

I tend to use $_ because it is shorter and most of my content needs to fit nicely in a book or in a blog post.  Let’s look at an object that we will place in the PowerShell pipeline.
PS Variable:\> Get-Date | Get-Member -MemberType Properties

   TypeName: System.DateTime

Name        MemberType     Definition                                                                 ----        ----------     ----------                                                               DisplayHint NoteProperty   DisplayHintType DisplayHint=DateTime                                     Date        Property       datetime Date {get;}                                                       Day         Property       int Day {get;}                                                           DayOfWeek   Property       System.DayOfWeek DayOfWeek {get;}                                         DayOfYear   Property       int DayOfYear {get;}                                                     Hour        Property       int Hour {get;}                                                           Kind        Property       System.DateTimeKind Kind {get;}                                           Millisecond Property       int Millisecond {get;}                                                   Minute      Property       int Minute {get;}                                                         Month       Property       int Month {get;}                                                         Second      Property       int Second {get;}                                                         Ticks       Property       long Ticks {get;}                                                         TimeOfDay   Property       timespan TimeOfDay {get;}                                                 Year        Property       int Year {get;}                                                           DateTime    ScriptProperty System.Object DateTime {get=if ((& { Set-StrictMode -Version 1; $this.DisplayHint }) -ieq  "Date")...    

This object has several members.  This first example will show you the results of using just $PSItem
PS C:\> Get-Date | ForEach-Object { $PSItem }

Tuesday, July 12, 2016 1:15:22 PM

This second example will show you the result of using $PSItem.DayOfYear
PS C:\> Get-Date | ForEach-Object { $PSItem.DayOfYear }

This third example involves a method of the object.
PS Variable:\> Get-Date | ForEach-Object { $PSItem.AddDays(10) }

Friday, July 22, 2016 2:59:56 PM

See the difference?  When you reference $PSItem, you are referencing the entire object.  When you add the name of a property or the name of a method of the object to $PSItem, you are asking for the value of that property or for that method to execute.

No comments: