PingList

Pinglist

$StartTime = Get-Date Write-Host "Starting $StartTime" #Import a source list of machines to test must have a column header of DiscoveryComputerName $pinglist = Import-Csv ".\ws.csv" #Filter this list to exclude lines without a value for DiscoveryComputername $pinglist = $pinglist | where {$_.DiscoveryComputername -ne ""} $Counter = $null foreach ($machine in $pinglist)  {      #Clear variable at the start of each iteration     $DNS = $null     $Domain = $null     $pingable = $null     $IPAddress = $null     $WMIOS = $null     $WMIOSInstallDate = $null     $WMIDomain = $null     $WMIError = $null     $ErrorString = $null     $MatchingNames = $null     $Counter ++     #add error trapping for DNS      #    Exception calling "GetHostByName" with "1" argument(s): "The requested name is valid, but no data of the requested type was found"     $DNS = [System.Net.Dns]::GetHostByName($machine.DiscoveryComputerName)     If ($DNS)      {         #Check if hostname lenght is longer than computername if so set Domain to hostname - computername         If ($dns.HostName.Length -gt $machine.DiscoveryComputerName.Length)             {$Domain = $DNS.HostName.Substring(($dns.HostName.Split(".")[0].length + 1))}         #get the First IP Address in the list         $IPAddress = $DNS.AddressList[0].IPAddressToString         $pingable=$(Test-Connection -Quiet -count 2 -ComputerName $IPAddress)         If ($pingable)         {             #get the Computername from WMI via IP address             $WMIOS = Get-WmiObject -ErrorVariable WMIError -ErrorAction SilentlyContinue -Class win32_operatingsystem -ComputerName $IPAddress             #If there was no error running the previouse line (wmi connection) do this wmi connection too             If($?)             {                 $WMIOSInstallDate = (([WMI]'').ConvertToDateTime($WMIOS.InstallDate)).tostring()                 $WMIDomain = $(Get-WmiObject -Class win32_Computersystem -ComputerName $IPAddress).Domain             }             #Test if the original computer name matches the name returned by WMI at that IP address if so "True" otherwise             #return the WMI errer if it exists or False if not             $MatchingNames = IF ($machine.DiscoveryComputerName -eq $WMIOS.CSName)                      {$true}                  ElseIf ($WMIError)                 {                     $ErrorString = "$WMIError"                     If($ErrorString -like '*Access is denied*'){"WMI Error - Access is denied"}                     ElseIf($ErrorString -like '*OutOfMemoryException*'){"WMI Error - OutOfMemoryException"}                     ElseIf($ErrorString -like '*Server execution failed*'){"WMI Error - Server execution failed"}                     ElseIf($ErrorString -like '*RPC server is unavailable*'){"WMI Error - RPC server is unavailable"}                     ElseIf($ErrorString -like '*Not Found*'){"WMI Error - Not Found"}                     Else                      {                         #return the errorstring to MathingName variable and write the new WMI error to a log file                         $ErrorString                         $WMIError | Out-File .\$($machine.DiscoveryComputerName)_error.txt                     }                 }                 Else {$false}         }     }     write-host "$Counter testing $($machine.DiscoveryComputerName) Pingable $pingable Names Match $MatchingNames"     $machine | Add-Member -membertype noteproperty -name FQDN -Value $DNS.HostName     $machine | Add-Member -membertype noteproperty -name DNSDomain -Value $Domain     $machine | Add-Member -membertype noteproperty -name DNSIPCount -Value $DNS.AddressList.count     $machine | Add-Member -membertype noteproperty -name FirstIPAddress -Value $IPAddress     $machine | Add-Member -membertype noteproperty -name Pingable -Value $Pingable     $machine | Add-Member -membertype noteproperty -name WMICSName -Value $WMIOS.CSName     $machine | Add-Member -membertype noteproperty -name WMIInstallDate -Value $WMIOSInstallDate     $machine | Add-Member -membertype noteproperty -name WMIDomain -Value $WMIDomain     $machine | Add-Member -membertype noteproperty -name MatchingNames -Value $MatchingNames }  $pinglist | Export-Csv -notype ".\Full_Output.csv" #export a list where the name on the list does not match the actual name of the machine. $pinglist | where {$_.MatchingNames -eq $False} | Export-Csv -notype ".\NonMatching_Output.csv"  $StopTime = Get-Date $ElapsedTime =$StopTime - $StartTime  Write-host "Script completed in $([Math]::Round($ElapsedTime.TotalMinutes,0)) Minutes"  

Simplified 

$StartTime = Get-Date Write-Host "Starting $StartTime" #Import a source list of machines to test must have a column header of HostName $InputFile = "c:\temp\serverlist.csv" $OutputFile = "c:\temp\serverlist_ouput.csv" $pinglist = Import-Csv $InputFile #Filter this list to exclude lines without a value for HostName $pinglist = $pinglist | where {$_.HostName -ne ""} $Counter = $null foreach ($machine in $pinglist)  {      #Write-host "$($machine.Hostname)"     #Clear variable at the start of each iteration     $DNS = $null     $Domain = $null     $pingable = $null     $IPAddress = $null     $Counter ++     #add error trapping for DNS      #    Exception calling "GetHostByName" with "1" argument(s): "The requested name is valid, but no data of the requested type was found"     $DNS = [System.Net.Dns]::GetHostByName($machine.Hostname)     If ($DNS)      {         #Check if hostname lenght is longer than computername if so set Domain to hostname - computername         If ($dns.HostName.Length -gt $machine.HostName.Length)             {$Domain = $DNS.HostName.Substring(($dns.HostName.Split(".")[0].length + 1))}         #get the First IP Address in the list         $IPAddress = $DNS.AddressList[0].IPAddressToString         $pingable=$(Test-Connection -Quiet -count 2 -ComputerName $IPAddress)          }     write-host "$Counter testing $($machine.Hostname) Pingable $pingable"     $machine | Add-Member -membertype noteproperty -name FQDN -Value $DNS.HostName     $machine | Add-Member -membertype noteproperty -name DNSDomain -Value $Domain     $machine | Add-Member -membertype noteproperty -name DNSIPCount -Value $DNS.AddressList.count     $machine | Add-Member -membertype noteproperty -name FirstIPAddress -Value $IPAddress     $machine | Add-Member -membertype noteproperty -name Pingable -Value $Pingable  }  $pinglist | Export-Csv -notype $OutputFile  $StopTime = Get-Date $ElapsedTime =$StopTime - $StartTime  Write-host "Script completed in $([Math]::Round($ElapsedTime.TotalMinutes,0)) Minutes"