Test-Connection

Welcome Forums General PowerShell Q&A Test-Connection

This topic contains 18 replies, has 5 voices, and was last updated by

 
Participant
2 years, 5 months ago.

  • Author
    Posts
  • #44011

    Participant
    Points: 0
    Rank: Member

    I run this script and I want it to tell me the name of the failed ping. Where "$computer is offline" is, I want it to show "pc2 is offline" or whatever pc fails the ping basically. Any ideas?

    $csv = Get-Content pclist.csv

    foreach ($computer in $csv)
    {
    try
    {
    Test-Connection $computer -Count 1 -ErrorAction Stop | Select-Object Address, IPV4Address
    }
    catch [System.Net.NetworkInformation.PingException]
    {
    '$computer is offline.'
    }
    }
    pause

    I'll end with a report that looks like this

    Address IPV4Address
    ——- ———–
    pc0 192.168.1.1
    pc1 192.168.1.2
    $computer is offline.

  • #44015

    Participant
    Points: 21
    Rank: Member

    'comp1','comp2' | % {[pscustomobject]@{online = [bool](test-connection $_ -Count 1 -quiet);computername = $_}}

    • #44033

      Participant
      Points: 0
      Rank: Member

      I apologize, I am very new to powershell, is this line replacing something or where specifically am i placing it?

  • #44038

    Participant
    Points: 21
    Rank: Member

    Pinging computers is every beginners favorite thing to do:-) I suggest browsing the the technet script repository here.

    https://gallery.technet.microsoft.com/scriptcenter

    • #44042

      Participant
      Points: 0
      Rank: Member

      Thanks! I will look into it. Appreciate the responses. I will see what I can do.

  • #44049

    Participant
    Points: 21
    Rank: Member
    
    foreach($computer in $computers){
    
    $test = test-connection $computer -Count 1  -ea 'silentlycontinue'
    
    [pscustomobject]@{
    
    status = if($test){'online'}else{'offline'}
    ipv4 = $test.ipv4address.ipaddresstostring
    name = $computer
    
    }
    
    }
    
    
  • #44053

    Participant
    Points: 0
    Rank: Member
    '$computer is offline.'

    This would not work if you want variable expansion. You would need to use double quotes for that.

    Here's another example of a one liner...

    Get-Content pclist.csv | Foreach-Object { If (Test-Connection -ComputerName $_ -Quiet -Count 1) { Write-Host "$_ is online" -ForegroundColor Green } Else { Write-Host "$_ failed ping" -ForegroundColor Red" } }
    • #44065

      Participant
      Points: 0
      Rank: Member

      Ahhh, Thanks! That was my issue. lol

  • #44057

    Participant
    Points: 21
    Rank: Member

    You just killed four puppies:-)

  • #44063

    Participant
    Points: 0
    Rank: Member

    Why would you have me do such a thing? lol

  • #44107

    Participant
    Points: 0
    Rank: Member

    To make life easier with Dan's excellent piece of code you can wrap a small function around it:

    function test-ping {
        
        $args | % {[pscustomobject]@{online = [bool](test-connection $_ -Count 1 -quiet);computername = $_}}
    }
    

    Then you can just type

    Test-ping Device1 Device2
    
  • #44114

    Participant
    Points: 22
    Rank: Member

    "Test-Connection -ComputerName SERVER -Quite" returns a System.Boolean Type,
    basically a "True" or "False"

    You could use it like;

    $Import = Get-Content -Path C:\ServerList.txt
    
    foreach ($a in $Import) {
        if (Test-Connection -ComputerName $a -Count 2 -Quite) { 
                Write-Host "Ping Succeeded" 
                } Else {
                  Write-Host "Ping Failed"
                }
    }
    
  • #44140

    Participant
    Points: 0
    Rank: Member

    Yes Nigel you are quite right, no requirement for the [bool] type.

    So as a short function :

    function test-ping { $args | % {[pscustomobject]@{online = test-connection $_ -Count 1 -quiet;computername = $_}} }
    
    #run
    Test-ping Device1 Device2
    
    • #44187

      Participant
      Points: 0
      Rank: Member

      I really like the output and speed of Grahams edit of Nigel's script! I wish it could show ipv4 and servicetag info as well. How would I pipe these into the script? Without the need for the txt/csv. Also I noticed it truncates the list of my ipv4 addresses with my original script which was annoying not to see the last octet of the contacted host. The last script listed seems to have a different list view output.

      $a = Get-Content "C:\Powershell\Computers.txt"

      foreach ($i in $a)
      {$i + "`n" + "=========================="; Get-WmiObject win32_SystemEnclosure -computername $i | select serialnumber}

  • #44313

    Participant
    Points: 0
    Rank: Member

    Hi Brad,

    This is a bit more code but should do what you require :

    function test-ping {
        param([Object[]]$Devices)        
        
                foreach ($Device in $Devices) {
    
                    if (test-connection $Device -Count 1 -quiet) {
        
                        [pscustomobject]@{
    
                        computername = $Device 
                        online       = "True"
                        IPaddress    = (test-connection $Device -Count 1).IPV4Address.IPAddressToString
                        serialnumber = (Get-WmiObject -ComputerName $device win32_SystemEnclosure).serialnumber
                        }
    
                    } else {
                        
                        [pscustomobject]@{
    
                        computername = $Device 
                        online       = "false"
                        IPaddress    = " `t- "
                        serialnumber = " `t-"
                        }
                    }
            }
    }
    
    

    let me know.

  • #44432

    Participant
    Points: 0
    Rank: Member

    I got it to work by calling the CSV and pointing the foreach to it. The only issues I have are the truncating of the tables and after about 15 down the list is stalls and never moves to the next computer. I don't see where I would specify the Devices to test-ping on without calling the csv though. Thanks Graham!

    • #44439

      Participant
      Points: 0
      Rank: Member

      Actually after hanging a while it threw this and didn't display the serial and loaded most of the rest of the list fine. So that's the issue. May be worthy to note that the errors are only thrown in windows 7 workstations and none of the Servers had the error.

      Get-WmiObject : The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)
      At C:\Users\user\Desktop\ps\New Text Document (2).ps1:15 char:37
      + ... alnumber = (Get-WmiObject -ComputerName $device win32_SystemEnclosure ...
      + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      + CategoryInfo : InvalidOperation: (:) [Get-WmiObject], COMException
      + FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

  • #44436

    Participant
    Points: 0
    Rank: Member

    Output example

    computername online IPaddress serialnumber
    ———— —— ——— ————
    Device1 Online 10.10.0.2 None
    Device2 Online 10.10.0.3 None
    Device3 Online 192.16... 30254V1
    Device4 Off... – –
    Device5 Online 10.10.0.4 None

  • #44522

    Participant
    Points: 0
    Rank: Member

    Hi Brad,

    So i've amended the code to look at WMI class Win32_Bios for the serial number instead of, win32_SystemEnclosure. Win32_Bios might be more generic for you:

    function test-ping {
        param([Object[]]$Devices)        
        
                foreach ($Device in $Devices) {
    
                    if (test-connection $Device -Count 1 -quiet) {
        
                        [pscustomobject]@{
    
                        computername = $Device 
                        online       = "True"
                        IPaddress    = (test-connection $Device -Count 1).IPV4Address.IPAddressToString
                        serialnumber = (Get-WmiObject -ComputerName $device win32_bios).SerialNumber
                        }
    
                    } else {
                        
                        [pscustomobject]@{
    
                        computername = $Device 
                        online       = "false"
                        IPaddress    = " `t- "
                        serialnumber = " `t-"
                        }
                    }
            }
    }
    

    Do you have a list of PC's in a txt or csv file ?

    If you have them in a file, you can use whats called a subexpression, $().

    So your's would look like this:

    test-ping $(get-content c:\temp\PCs.csv) 
    

    Or if you just want to pass a couple to test-ping:

    test-ping PC1, PC2, PC3
    

    Does that help ?

The topic ‘Test-Connection’ is closed to new replies.