Object based output is a key difference between our DOS
applications and PowerShell.  Take a look
at the output of PING and Test-Connection.
Pinging 8.8.8.8 with 32
bytes of data:
Reply from 8.8.8.8:
bytes=32 time=41ms TTL=57
Reply from 8.8.8.8:
bytes=32 time=38ms TTL=57
Reply from 8.8.8.8:
bytes=32 time=40ms TTL=57
Reply from 8.8.8.8:
bytes=32 time=37ms TTL=57
Ping statistics for
8.8.8.8:
    Packets: Sent = 4, Received = 4, Lost = 0
(0% loss),
Approximate round trip
times in milli-seconds:
    Minimum = 37ms, Maximum = 41ms, Average =
39ms
PS C:\>
Test-Connection 8.8.8.8
Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms) 
------        -----------     -----------      -----------                              -----    -------- 
JASONPC2      8.8.8.8         8.8.8.8                                                   32       40      
JASONPC2      8.8.8.8         8.8.8.8                                                  
32       40       
JASONPC2      8.8.8.8         8.8.8.8                                                   32      
46       
JASONPC2      8.8.8.8         8.8.8.8                                                  
32       37   
Each has a time value. 
The difference is that PING produces string where Test-Connection
produces objects
PS C:\> Ping 8.8.8.8 | Get-Member 
    TypeName: System.String
Name            
MemberType           
Definition                                                   
                                                       
----            
----------           
----------                                                                                                          
Clone           
Method                System.Object
Clone(), System.Object ICloneable.Clone()                                                             
CompareTo       
Method                int
CompareTo(System.Object value), int CompareTo(string strB), int
IComparable.CompareTo(System.Object obj), int ...
Contains        
Method                bool
Contains(string value)                                                                                         
CopyTo          
Method                void
CopyTo(int sourceIndex, char[] destination, int destinationIndex, int
count)                                   
EndsWith        
Method                bool
EndsWith(string value), bool EndsWith(string value, System.StringComparison
comparisonType), bool EndsWith(st...
Equals          
Method                bool Equals(System.Object obj),
bool Equals(string value), bool Equals(string value, System.StringComparison
compa...
GetEnumerator   
Method               
System.CharEnumer 
PS C:\> Test-Connection 8.8.8.8 | Get-Member 
   TypeName: System.Management.ManagementObject#root\cimv2\Win32_PingStatus
Name                          
MemberType     Definition                                                                                                   
----                          
----------     ----------                                                                                                   
PSComputerName                
AliasProperty  PSComputerName =
__SERVER                                                                                    
Address                       
Property       string Address
{get;set;}                                                                                     
BufferSize                    
Property       uint32 BufferSize
{get;set;}                                                                                 
NoFragmentation               
Property       bool NoFragmentation {get;set;}                                                                              
PrimaryAddressResolutionStatus Property       uint32 PrimaryAddressResolutionStatus
{get;set;}                                                              
ProtocolAddress               
Property       string
ProtocolAddress {get;set;}                 
Let’s try to filter for only returns that have a time that
is greater than 40.
PS C:\> Ping 8.8.8.8 | Where ResponceTime -gt 40
PS C:\>  
We get noting because a string object does not have a
property for ResponceTime or any property for that matter.
PS C:\>
Test-Connection 8.8.8.8 | Where ResponseTime -gt 40
Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms) 
------        -----------     -----------      -----------                              -----    -------- 
JASONPC2      8.8.8.8         8.8.8.8                                               
   32       42      
JASONPC2      8.8.8.8         8.8.8.8                                                  
32       46    
Since Test-Connection produces an object with a property
called ResponceTime, we are able to examine
its value and use it.  
Here is the difference between using objects and not.  In this example, I want to see only responses
from PING where the TIME value is greater than 20.  Since PING places characters on the screen, I
need to capture those characters and teach PowerShell where in the string to
look for the response time. Here is the code.
Ping 8.8.8.8
| 
    ForEach-Object
{
        If
($_ -like "*=*")
{
            $OrigionalString
= $_
            $String
= ($_.Remove(0,$_.IndexOf("=")+1))
            $String2
= $String.Remove($String.IndexOF(" "))
            $String2
-as [Int] | 
                Where
{$_ -gt 20}
| 
                ForEach-Object
{Write-Output $OrigionalString}
            }
    } 
Here is the same operation using the object produced by
Test-Connection
Test-Connection 8.8.8.8 | Where
ResponseTime  -gt 20 
Clearly using objects is going to save you a lot of time in
developing, test, and supporting your code. 
That fact that we have properties means that we have usable information.
Comments