Solved

Powershell Script needed

Posted on 2010-09-02
8
468 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
  • 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 70

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
 
LVL 70

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
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 

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 70

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

Threat Intelligence Starter Resources

Integrating threat intelligence can be challenging, and not all companies are ready. These resources can help you build awareness and prepare for defense.

Join & Write a Comment

Microsoft Windows Server Update Service (WSUS) is free for everyone, but it lacks of some desirable features like send an e-mail to the administrator with the status of all computers on the WSUS server. This article is based on my PowerShell script …
In this post we will learn how to connect and configure Android Device (Smartphone etc.) with Android Studio. After that we will run a simple Hello World Program.
An introduction to basic programming syntax in Java by creating a simple program. Viewers can follow the tutorial as they create their first class in Java. Definitions and explanations about each element are given to help prepare viewers for future …
Viewers will learn how to properly install Eclipse with the necessary JDK, and will take a look at an introductory Java program. Download Eclipse installation zip file: Extract files from zip file: Download and install JDK 8: Open Eclipse and …

744 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

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now