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