Solved

Powershell Script needed

Posted on 2010-09-02
8
473 Views
Last Modified: 2012-05-10
I would like a script that does the following. Compare two text files and find duplicates. Then take the duplicates and try to ping them. If the address can't be resolved(only this case "Ping request could not find host $hostname") then output to file. I'm looking for the exact code, I'm pretty sure it's out there, just don't have the time right now and it's an easy 500 points.
0
Comment
Question by:LouisSanchez
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 3
  • 2
8 Comments
 
LVL 3

Assisted Solution

by:bobalob
bobalob earned 250 total points
ID: 33585974
Ok here's one - cheap and dirty - doesn't do any exception catching, makes nasty red exception text appear on the screen, but only had 5 mins to do it. I have't done any testing with this apart from making sure it kinda works. If you get *any* exception from the ping the host will be added to the output file.

I'll do it again with DNS lookup when I get some time but this will be a start...
$file1 = gc c:\temp\file1.txt
$file2 = gc c:\temp\file2.txt

$FinalResultsArry

foreach ($server in $file1)
{
	if ($file2 -contains $server)
	{
		write-host "Duplicate-Found - Pinging $($server)..." -nonewline
		$pingObj,$pingresult = $null
		$pingObj = new-object System.Net.NetworkInformation.Ping
		$PingResult = $pingObj.send($server)
		Write-host "$($pingresult.status)"
		if ($Pingresult.status -eq $null) {$FinalResultsArry += $server}
	}
}

$FinalResultsArry | Out-File -file "c:\temp\output.txt" -enc ASCII

Open in new window

0
 
LVL 3

Expert Comment

by:bobalob
ID: 33585979
oh, it *won't* add a host which just times out to the output.txt by the way...
0
 
LVL 71

Accepted Solution

by:
Chris Dent earned 250 total points
ID: 33586659

I've used Compare-Object to find the matching entries between the files, and System.Net.Dns to tell you if the name resolves to an IP rather than Ping.

If you set $VerbosePreference = "continue" you'll see the verbose messages as well, useful for checking it's doing something.

Chris
Compare-Object $(Get-Content File1.txt) $(Get-Content File2.txt) -ExcludeDifferent -IncludeEqual | ForEach-Object {
  $Entry = $Null
  Try {
    $Entry = [Net.Dns]::GetHostEntry($_.InputObject)
  } Catch { }
  If (!$?) {
    "Ping request could not find host $($_.InputObject)"
  }
  Write-Verbose "$($_.InputObject) : $($Entry.AddressList)"
}

Open in new window

0
Transaction Monitoring Vs. Real User Monitoring

Synthetic Transaction Monitoring Vs. Real User Monitoring: When To Use Each Approach? In this article, we will discuss two major monitoring approaches: Synthetic Transaction and Real User Monitoring.

 
LVL 71

Expert Comment

by:Chris Dent
ID: 33586778

I forgot to add file output, if you redirect at the end it'll deal with that.

That is, add this after the last curly bracket:  > OutputFile.txt

Chris
0
 

Author Comment

by:LouisSanchez
ID: 33586993
I guess I need more of a merge of duplicates not just only duplicates. This is what I have. If one of you guys could spruce it up I'll be all set.

#delete
$NULL>test.txt

#Merge Files
$file = gc file1.txt
$file += gc file2.txt
$file=$file | sort | get-unique
$file | Out-File -file "merge.txt" -enc ASCII

Compare-Object $(Get-Content merge.txt) $(Get-Content merge.txt) -IncludeEqual | ForEach-Object {
  $Entry = $Null
  Try {
    $Entry = [Net.Dns]::GetHostEntry($_.InputObject)
  } Catch { }
  If (!$?) {
    "Ping request could not find host $($_.InputObject)"
    $_.InputObject>> test.txt
  }
  Write-Verbose "$($_.InputObject) : $($Entry.AddressList)"
  }
0
 
LVL 71

Expert Comment

by:Chris Dent
ID: 33587097

You mean you need a unique list of machines from both files?

Chris
0
 

Author Comment

by:LouisSanchez
ID: 33587128
Yes in other words merge, remove duplicates, process remaining machines.
0
 
LVL 3

Assisted Solution

by:bobalob
bobalob earned 250 total points
ID: 33587204
i guessed thats what he ment - i've plagurised your code to make something horrific but works as requested.


#Merge Files
$file = gc c:\temp\file1.txt
$file += gc c:\temp\file2.txt
$file=$file | sort | get-unique


$output = $file | ForEach-Object {
  $Entry = $Null
  Try {
    $Entry = [Net.Dns]::GetHostEntry($_)
  } Catch { }
  If (!$?) {
    "$($_) : Ping request could not find host"
    $_.InputObject>> test.txt
  } else {
  "$($_) : $($Entry.AddressList)"}
  } 

$output | out-file -file c:\temp\output.txt -enc ASCII

gc c:\temp\output.txt | ? {$_ -match "Ping request could not find host"}

Open in new window

0

Featured Post

Problems using Powershell and Active Directory?

Managing Active Directory does not always have to be complicated.  If you are spending more time trying instead of doing, then it's time to look at something else. For nearly 20 years, AD admins around the world have used one tool for day-to-day AD management: Hyena. Discover why

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In this post we will learn how to make Android Gesture Tutorial and give different functionality whenever a user Touch or Scroll android screen.
The following article is intended as a guide to using PowerShell as a more versatile and reliable form of application detection in SCCM.
Progress
Starting up a Project

690 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question