Creating Highspeed Ping (Part 5)

by Feb 21, 2018

In the previous tip we created a lightning fast new PowerShell function called Test-OnlineFast which used WMI to ping any number of computers with high performance. Today we’ll make it even more useful by adding a number of additional properties to the ping result.

Let’s first check how Test-OnlineFast works. Here are some examples. Let’s first ping a number of computers. You can use both computer names and IP addresses:

PS> Test-OnlineFast -ComputerName,,,

Address                Online DNSName                Status           
-------                ------ -------                ------                  True DESKTOP-7AAMJLF        Success                 True              Success    True Success             False                        Request Timed Out

Let’s now ping an entire IP segment. The below example was taken from our public hotel WLAN (make sure you adjust the IP range to the network you are located in):

PS> $iprange = 1..200 | ForEach-Object { "192.168.189.$_" }

PS> Test-OnlineFast -ComputerName $iprange

Address         Online DNSName                            Status           
-------         ------ -------                            ------     True          Success      True                          Success    True                  Success     True fritz.repeater                     Success     True Success    True                Success     True          Success     True Success    False                                    Request Timed Out  False                                    Request Timed Out  False                                    Request Timed Out 

The amazing thing is the tremendous speed. Pinging an entire subnet takes only a few seconds.

Now let’s take a look at the function. We explained part of it in our previous tips. This version adds useful properties to the ping result, like “Online” and “DnsName”, and it returns a friendly text for the ping status instead of a cryptic numeric value. All of this was done using hash tables that produced calculated properties, based on the raw information returned by ping:

function Test-OnlineFast
        # make parameter pipeline-aware

        $TimeoutMillisec = 1000

    # hash table with error code to text translation
    $StatusCode_ReturnValue = 
        11001='Buffer Too Small'
        11002='Destination Net Unreachable'
        11003='Destination Host Unreachable'
        11004='Destination Protocol Unreachable'
        11005='Destination Port Unreachable'
        11006='No Resources'
        11007='Bad Option'
        11008='Hardware Error'
        11009='Packet Too Big'
        11010='Request Timed Out'
        11011='Bad Request'
        11012='Bad Route'
        11013='TimeToLive Expired Transit'
        11014='TimeToLive Expired Reassembly'
        11015='Parameter Problem'
        11016='Source Quench'
        11017='Option Too Big'
        11018='Bad Destination'
        11032='Negotiating IPSEC'
        11050='General Failure'

    # hash table with calculated property that translates
    # numeric return value into friendly text

    $statusFriendlyText = @{
        # name of column
        Name = 'Status'
        # code to calculate content of column
        Expression = { 
            # take status code and use it as index into
            # the hash table with friendly names
            # make sure the key is of same data type (int)

    # calculated property that returns $true when status -eq 0
    $IsOnline = @{
        Name = 'Online'
        Expression = { $_.StatusCode -eq 0 }

    # do DNS resolution when system responds to ping
    $DNSName = @{
        Name = 'DNSName'
        Expression = { if ($_.StatusCode -eq 0) { 
                if ($_.Address -like '*.*.*.*') 
                { [Net.DNS]::GetHostByAddress($_.Address).HostName  } 
                { [Net.DNS]::GetHostByName($_.Address).HostName  } 

    # convert list of computers into a WMI query string
    $query = $ComputerName -join "' or Address='"

    Get-WmiObject -Class Win32_PingStatus -Filter "(Address='$query') and timeout=$TimeoutMillisec" |
    Select-Object -Property Address, $IsOnline, $DNSName, $statusFriendlyText

Are you an experienced professional PowerShell user? Then learning from default course work isn’t your thing. Consider learning the tricks of the trade from one another! Meet the most creative and sophisticated fellow PowerShellers, along with Microsoft PowerShell team members and PowerShell inventor Jeffrey Snover. Attend this years’ PowerShell Conference EU, taking place April 17-20 in Hanover, Germany, for the leading edge. 35 international top speakers, 80 sessions, and security workshops are waiting for you, including two exciting evening events. The conference is limited to 300 delegates. More details at

Twitter This Tip! ReTweet this Tip!