Advanced Windows PowerShell Scripting Video Training

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

Wednesday, September 21, 2016

ByValue for Generic Objects

This is post 4 of 7 in this series.

Some cmdlets are designed to work with any object.  Take a look at the –InputObject parameter of Sort-Object.

-InputObject []
    Specifies the objects to sort.
   
    When you use the InputObject parameter to submit a collection of items, Sort-Object
    receives one object that represents the collection. Because one object cannot be
    sorted, Sort-Object returns the entire collection unchanged.
   
    To sort objects, pipe them to Sort-Object.
   
    Required?                    false
    Position?                    named
    Default value                none
    Accept pipeline input?       true (ByValue)
    Accept wildcard characters?  false

Whenever you see a parameter accepting objects of type Object or PSObject, then you know that this cmdlet can handle anything. Let’s take a look at the results of Get-SMBShare without using Sort-Object

PS C:\> Get-SmbShare

Name   ScopeName Path                              Description   
----   --------- ----                              -----------   
ADMIN$ *         C:\WINDOWS                        Remote Admin  
C$     *         C:\                               Default share 
D$     *         D:\                               Default share 
E$     *         E:\                               Default share 
IPC$   *                                           Remote IPC    
print$ *         C:\WINDOWS\system32\spool\drivers Printer Drivers

Just by looking at it, the cmdlet sends the objects into the pipeline sorted alphabetically on the Name property.  Now let’s pipe it to Sort-Object.

PS C:\> Get-SmbShare | Sort-Object

Name   ScopeName Path                              Description   
----   --------- ----                              -----------   
ADMIN$ *         C:\WINDOWS                        Remote Admin  
C$     *         C:\                               Default share 
D$     *         D:\                               Default share 
E$     *         E:\                               Default share 
IPC$   *                                           Remote IPC    
print$ *         C:\WINDOWS\system32\spool\drivers Printer Drivers

The results are the same.  Well, that was useful.  The thing that we forgot to do was to tell Sort-Object how to sort our objects.

PS C:\> Get-SmbShare | Sort-Object -Property Description

Name   ScopeName Path                              Description   
----   --------- ----                              -----------   
C$     *         C:\                               Default share 
D$     *         D:\                               Default share 
E$     *         E:\                               Default share 
print$ *         C:\WINDOWS\system32\spool\drivers Printer Drivers
ADMIN$ *         C:\WINDOWS                        Remote Admin  
IPC$   *                                           Remote IPC   


For this cmdlet to do anything, you need to give it some instructions.  In this case, which property to sort on. Sort-Object has been around since PowerShell v1.0.  Get-SMBShare was introduced in PowerShell v3.0, but only if you are running Windows 8 or newer.  In other words, the author of the Sort-Object cmdlet had no idea that the cmdlet Get-SMBShare would ever be created.  The author simple coded the Sort-Object cmdlet to accept all objects. Because of this, we can continue to sort objects evening with PowerShell v5.1.

No comments: